- •Введение.
- •Соединение с бд 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.
- •Задача. Взятие последней записи о клиенте.
- •Задача. Отчет об изменениях зарплаты.
- •Задача. Пакет функций о вкладах.
- •Задача. Группировка лога выполнения процессов.
- •Задача. Вьюшка с аналитическими функциями по вкладам.
- •Задача. Календарь с аналитикой.
- •Задача. Поиск баланса счета на заданную дату.
- •Задача. Удаление исторических данных о рейтинге.
- •Функции, выдающие более одного значения.
- •Задача. Вызов многозначной функции.
- •"Расклейка" и "склейка" строк.
- •“Расклейка” одной строки.
- •“Расклейка” нескольких строк с группировкой.
- •“Склейка” в одну строку.
- •“Склейка” нескольких строк с группировкой.
- •Задача. Простая расклейка-склейка.
- •Задача. Скрипт создания индексов.
- •Задача. Скрипт создания таблиц.
- •Задача. Отчет о созданных объектах.
- •Задача. Отчет о числе строк в таблицах.
- •Задача. Расклейка списка хобби.
- •Задача. Склейка запроса о максимумах числовых полей.
- •Оптимизация запросов.
Задача. Скрипт создания таблиц.
Получить из словаря данных упрощенный скрипт создания всех таблиц текущей схемы.
Напишем запрос, вглядевшись в поля data_type, data_precision, data_scale, data_length:
select 'CREATE TABLE ' || tc.table_name || ' (' ||
wm_concat(tc.column_name || ' ' || tc.data_type || case
when data_type = 'NUMBER' and data_precision is not null then
'(' || data_precision || ',' || data_scale || ')'
when data_type in ('VARCHAR2', 'CHAR') then
'(' || data_length || ')'
end) || ');' create_table_script
from user_tab_columns tc, user_objects o
where tc.table_name = o.object_name
and o.object_type = 'TABLE'
group by tc.table_name;
Задача. Отчет о созданных объектах.
Написать запрос, который собирает из USER_OBJECTS по объектам, начинающимся с 'KK', строку вида:
'2012-01-12 12:16:05 создали FUNCTION KK_FUNC. 2012-01-15 11:06:15 создали VIEW KK_VIEW1. 2012-01-17 18:00:01 создали TABLE KK_TAB1. ...'
в порядке создания. Запрос должен выдавать 1 строку.
В подзапросе q1 собираем информацию об интересующих нас объектах, далее используем его в ранее описанном запросе по склейке строк в одну.
select res
from (select replace(sys_connect_by_path(string_about_creation, '@'), '@') as res,
level
from (select string_about_creation,
ordr,
lag(ordr) over(order by ordr) as prev_ordr
from (select created,
to_char(created, 'dd.mm.yyyy hh24:mi:ss') ||
' создали ' || object_type || ' ' ||
object_name || '.' || chr(13) || chr(10) as string_about_creation,
row_number() over(order by created) ordr
from user_objects
where object_name like 'KK%') q1)
start with prev_ordr is null
connect by prev_ordr = prior ordr
order by level desc)
where rownum = 1;
Задача. Отчет о числе строк в таблицах.
Создать пустую таблицу KK_CNT_REPORT(table_name varchar2(30), cnt number).
Написать процедуру KK_FILL_CNT_REPORT(in_table_list in varchar), которая на входе получает список таблиц, разделенных запятыми, например, 'KK_TBL1,KK_TBL2,KK_TBL3', и заполняет таблицу KK_CNT_REPORT данными о количестве строк в этих таблицах.
Создадим таблицу:
CREATE TABLE KK_CNT_REPORT(TABLE_NAME VARCHAR2(30), CNT NUMBER);
Напишем требуемую процедуру, используя запрос по "расклейке"
CREATE OR REPLACE PROCEDURE KK_FILL_CNT_REPORT(IN_TABLE_LIST IN VARCHAR2) IS
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE KK_CNT_REPORT';
FOR Z IN (SELECT REGEXP_SUBSTR(IN_TABLE_LIST, '[^,]+', 1, LEVEL) TABLE_NAME
FROM DUAL
CONNECT BY REGEXP_SUBSTR(IN_TABLE_LIST, '[^,]+', 1, LEVEL) IS NOT NULL) LOOP
EXECUTE IMMEDIATE 'INSERT INTO KK_CNT_REPORT (TABLE_NAME, CNT) SELECT ''' ||
Z.TABLE_NAME || ''', COUNT(1) FROM ' || Z.TABLE_NAME;
END LOOP;
COMMIT;
END KK_FILL_CNT_REPORT;
Запустим процедуру:
BEGIN
KK_FILL_CNT_REPORT('KK_MKB,KK_STUD_2010,KK_STUD_2012,KK_STUDENTS_ALL_YEARS');
END;
Проверим результат:
SELECT * FROM KK_CNT_REPORT;
