
- •Введение.
- •Соединение с бд Oracle.
- •Типы данных Oracle, создание и модификация таблиц и вьюшек.
- •Задача. Удаление дубликатов.
- •Задача. Удаление по условию not in.
- •Функции по работе со строками.
- •Функции по работе с числами.
- •Троичная логика, конструкция with, функции nvl, coalesce, case, decode.
- •Основы pl/sql.
- •Задача. Факториал.
- •Задача. Подсчет числа вхождений символа в строку.
- •Задача. Подсчет числа вхождений подстроки в строку.
- •Задача. Копирование таблицы фиксированной структуры.
- •Задача. Простановка count в цикле.
- •Задача. Распределение данных по условию.
- •Задача. Использование сиквенсов и dbms_random.
- •Задача. Процедура с out параметрами. Нотации.
- •Задача. Простой пакет.
- •Задача. Разные виды Count.
- •Задача. Получение скрипта заполнения таблицы имеющимися данными.
- •Раздача прав (grants).
- •Операции над множествами, joins.
- •Задача. Сравнение множеств.
- •Задача. Загрузка данных с помощью full join.
- •Задача. Проставление роста животных.
- •Оператор merge.
- •Задача. Merge данных о студентах.
- •Задача. Merge данных о клиентах.
- •Функции по работе с датами.
- •Словарь данных.
- •Задача. Last_ddl_time.
- •Задача. Отчет об объектах текущей схемы.
- •Задача. Dbms_output из явного курсора по словарю данных.
- •Задача. Компиляция схемы.
- •Задача. Поиск текста во вьюшках.
- •Динамический sql.
- •Задача. Удаление конкретной таблицы, если она существует.
- •Задача. Удаление любой таблицы с проверкой на существование.
- •Задача. Конструкция '%rowcount'.
- •1) С помощью динамического вызова команды truncate очистить таблицу kk_objects_list от данных.
- •3) Вставить в таблицу kk_objects_list перечень имен всех объектов текущей схемы. С помощью конструкции sql%rowcount выдать в dbms_output количество вставившихся строк.
- •Задача. Удаление всех таблиц и вьюшек.
- •Часть 1. Написать pl/sql блок, который дропает все таблицы текущей схемы, начинающиеся на 'kk_'.
- •Часть 2. Написать pl/sql блок, который выдает в dbms_output скрипт удаления всех вьюшек текущей схемы, начинающихся с 'vw_kk%'.
- •Задача. Отчет о максимальных id.
- •Задача. Переименование столбцов.
- •Задача. Создание вьюшек.
- •Триггеры.
- •Задача. Автоинкрементное поле.
- •Задача. Триггер конвертации сумм в валюте.
- •Задача. Триггер логирования dml-операций.
- •Задача. Триггер зеркалирования.
- •Задача. Триггер по поиску в справочнике.
- •Задача. Триггер контроля.
- •Global temporary tables и переменные в заголовке пакета.
- •Переменные в заголовке пакета.
- •Регулярные выражения.
- •Задача. Правка некачественных данных регулярными выражениями.
- •Задача. Парсинг строк с помощью регулярных выражений.
- •Автономные транзакции.
- •Задача. Автономное логирование этапов загрузки.
- •Иерархические запросы.
- •Задача. Вывод иерархии с отступами.
- •Задача. Соединение иерархической таблицы с обычной.
- •Задача. Сумма зарплат подчиненных.
- •Задача. Простой календарь.
- •Задача. Детальный календарь.
- •Задача. Календарь с индикаторами выходных дней.
- •Аналитические функции.
- •Отступление о Rownum.
- •Негрупповые аналитические функции.
- •Групповая функция keep dense_rank.
- •Задача. Взятие последней записи о клиенте.
- •Задача. Отчет об изменениях зарплаты.
- •Задача. Пакет функций о вкладах.
- •Задача. Группировка лога выполнения процессов.
- •Задача. Вьюшка с аналитическими функциями по вкладам.
- •Задача. Календарь с аналитикой.
- •Задача. Поиск баланса счета на заданную дату.
- •Задача. Удаление исторических данных о рейтинге.
- •Функции, выдающие более одного значения.
- •Задача. Вызов многозначной функции.
- •"Расклейка" и "склейка" строк.
- •“Расклейка” одной строки.
- •“Расклейка” нескольких строк с группировкой.
- •“Склейка” в одну строку.
- •“Склейка” нескольких строк с группировкой.
- •Задача. Простая расклейка-склейка.
- •Задача. Скрипт создания индексов.
- •Задача. Скрипт создания таблиц.
- •Задача. Отчет о созданных объектах.
- •Задача. Отчет о числе строк в таблицах.
- •Задача. Расклейка списка хобби.
- •Задача. Склейка запроса о максимумах числовых полей.
- •Оптимизация запросов.
Задача. Удаление любой таблицы с проверкой на существование.
Написать процедуру kk_drop_table_if_exists(in_table_name in varchar2), которая дропает таблицу только, если она существует в текущей схеме, иначе процедура ничего не делает.
create or replace procedure kk_drop_table_if_exists(in_table_name in varchar2) is
begin
for z in (select table_name
from user_tables
where table_name = in_table_name) loop
execute immediate 'drop table ' || in_table_name;
end loop;
end kk_drop_table_if_exists;
Проверим:
begin
kk_drop_table_if_exists('KK1');
end;
Задача. Конструкция '%rowcount'.
Создать таблицу:
create table kk_objects_list(object_name varchar2(30));
1) С помощью динамического вызова команды truncate очистить таблицу kk_objects_list от данных.
2) Открыть явный курсор со списком объектов текущей схемы, начинающихся с 'KK_'. Сделать fetch всех данных из курсора. С помощью конструкции <имя явного курсора>%rowcount выдать в dbms_output количество строк в этом курсоре. Закрыть курсор.
3) Вставить в таблицу kk_objects_list перечень имен всех объектов текущей схемы. С помощью конструкции sql%rowcount выдать в dbms_output количество вставившихся строк.
Напишем и выполним такой блок кода и посмотрим в dbms_output.
declare
cursor kk_cr is
select object_name
from all_objects
where object_name like 'KK\_%' escape '\';
v_gt kk_cr%rowtype;
begin
-- 1
execute immediate 'truncate table kk_objects_list';
dbms_output.put_line('1) Таблица kk_objects_list очищена от данных.');
-- 2
open kk_cr;
fetch kk_cr
into v_gt;
while kk_cr%found loop
fetch kk_cr
into v_gt;
end loop; /* только после полного fetch-а в kk_cr%rowcount будет полное количество строк в курсоре */
dbms_output.put_line('2) Найдено ' || to_char(kk_cr%rowcount) ||
' объектов текущей схемы, начинающихся с ''KK_''.');
close kk_cr;
-- 3
insert into kk_objects_list
(object_name)
select object_name from user_objects;
dbms_output.put_line('3) В таблицу kk_objects_list вставлено ' ||
to_char(sql%rowcount) ||
' имен объектов текущей схемы.'); /* это значение sql%rowcount "забудется" после commit или следующей команды */
commit;
end;
Можно посмотреть результат последней вставки:
select object_name from kk_objects_list;
Конструкцию sql%rowcount можно использовать не только поле insert, но и после update, delete, merge.
Задача. Удаление всех таблиц и вьюшек.
Часть 1. Написать pl/sql блок, который дропает все таблицы текущей схемы, начинающиеся на 'kk_'.
Напишем блок, запускающий динамический SQL:
begin
for z in (select 'drop table ' || table_name as drop_statement
from user_tables
where table_name like 'KK%') loop
execute immediate z.drop_statement;
end loop;
end;
Часть 2. Написать pl/sql блок, который выдает в dbms_output скрипт удаления всех вьюшек текущей схемы, начинающихся с 'vw_kk%'.
Напишем блок, выдающий скрипт:
BEGIN
FOR Z IN (SELECT VIEW_NAME FROM USER_VIEWS WHERE VIEW_NAME LIKE 'VW_KK%') LOOP
DBMS_OUTPUT.PUT_LINE('DROP VIEW ' || TO_CHAR(Z.VIEW_NAME) || ';');
END LOOP;
END;