- •Введение.
- •Соединение с бд 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.
- •Задача. Взятие последней записи о клиенте.
- •Задача. Отчет об изменениях зарплаты.
- •Задача. Пакет функций о вкладах.
- •Задача. Группировка лога выполнения процессов.
- •Задача. Вьюшка с аналитическими функциями по вкладам.
- •Задача. Календарь с аналитикой.
- •Задача. Поиск баланса счета на заданную дату.
- •Задача. Удаление исторических данных о рейтинге.
- •Функции, выдающие более одного значения.
- •Задача. Вызов многозначной функции.
- •"Расклейка" и "склейка" строк.
- •“Расклейка” одной строки.
- •“Расклейка” нескольких строк с группировкой.
- •“Склейка” в одну строку.
- •“Склейка” нескольких строк с группировкой.
- •Задача. Простая расклейка-склейка.
- •Задача. Скрипт создания индексов.
- •Задача. Скрипт создания таблиц.
- •Задача. Отчет о созданных объектах.
- •Задача. Отчет о числе строк в таблицах.
- •Задача. Расклейка списка хобби.
- •Задача. Склейка запроса о максимумах числовых полей.
- •Оптимизация запросов.
Задача. Last_ddl_time.
Выдать список объектов из user_objects, которые были модифицированы (last_ddl_time) за последние полгода.
SELECT *
FROM USER_OBJECTS
WHERE MONTHS_BETWEEN(SYSDATE, LAST_DDL_TIME) < 6
ORDER BY LAST_DDL_TIME DESC;
Задача. Отчет об объектах текущей схемы.
В цикле по всем объектам из user_objects вывести в dbms_output отчет со следующими полями: тип объекта, название объекта, дата создания. Отсортировать по дате создания.
begin
dbms_output.enable;
for z in (select object_type, object_name, created
from user_objects
order by created) loop
dbms_output.put_line(rpad(z.object_type, 31) ||
rpad(z.object_name, 31) ||
to_char(z.created, 'dd.mm.yyyy hh24:mi:ss'));
end loop;
end;
Задача. Dbms_output из явного курсора по словарю данных.
По всем таблицам начинающимся с 'KK_TABLE' сгенерировать в dbms_output скрипт выборки всех полей из этих таблиц:
Select column11, column12, … , column1M from table1;
Select column21, column22, … , column2M from table2;
...
Select columnN1, columnN2, … , columnNM from tableN;
Создадим таблицы для теста:
CREATE TABLE KK_TABLE1(ID1 INTEGER, ID2 INTEGER, ID3 INTEGER);
CREATE TABLE KK_TABLE2(NAME1 VARCHAR2(10), NAME2 VARCHAR2(10));
CREATE TABLE KK_TABLE3(DT1 DATE);
CREATE TABLE KK_TABLE4(С1 CHAR(1), C2 CHAR(2));
Во вьюшке USER_TAB_COLUMNS можно смотреть столбцы таблиц пользователя, под которым залогинен. Напишем блок, решающий задачу с использованием явного именованного курсора CR_TAB_COLUMNS:
DECLARE
CURSOR CR_TAB_COLUMNS IS
SELECT TABLE_NAME, COLUMN_NAME
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME LIKE 'KK_TABLE%'
ORDER BY TABLE_NAME, COLUMN_ID;
V_GT CR_TAB_COLUMNS%ROWTYPE;
V_COLUMN_LIST VARCHAR2(4000) := '';
V_PREV_TABLE_NAME VARCHAR2(30) := '';
BEGIN
OPEN CR_TAB_COLUMNS;
LOOP
FETCH CR_TAB_COLUMNS
INTO V_GT;
IF V_PREV_TABLE_NAME <> V_GT.TABLE_NAME OR CR_TAB_COLUMNS%NOTFOUND /*Если пошла новая таблица или таблицы кончились, вывести SELECT в DBMS_OUTPUT*/ THEN
DBMS_OUTPUT.PUT_LINE('SELECT ' || SUBSTR(V_COLUMN_LIST, 3) ||
' FROM ' || V_PREV_TABLE_NAME || ';');
V_COLUMN_LIST := '';
END IF;
V_COLUMN_LIST := V_COLUMN_LIST || ', ' || V_GT.COLUMN_NAME; /*Накапливаем список столбцов*/
V_PREV_TABLE_NAME := V_GT.TABLE_NAME; /*Запоминаем таблицу с прошлой итерации цикла. Если таблица поменялась, то вывести готовый SELECT, иначе следует накапливать ее столбцы в V_COLUMN_LIST.*/
EXIT WHEN CR_TAB_COLUMNS%NOTFOUND;
END LOOP;
CLOSE CR_TAB_COLUMNS;
END;
Задача. Компиляция схемы.
Выдать из user_objects скрипт компиляции инвалидных объектов (status = 'INVALID').
Если функции, процедуры или пакеты содержат ошибки или пришли в неоткомпилированное состояние в результате изменений в объектах, от которых они зависят, то они видны в user_objects со статусом status = 'INVALID'.
Компилировать их можно такими командами:
alter function kk_fnc compile;
alter procedure kk_prc compile;
alter package kk_pkg compile;
alter package kk_pkg compile body;
При изменении объектов следует не забывать о компиляции зависящих от них объектов.
Также всю схему можно откомпилировать радикальным вызовом:
begin
dbms_utility.compile_schema('<имя схемы>');
end;
Этот запрос выдает скрипт, решающий задачу:
SELECT 'ALTER ' || OBJECT_TYPE || ' ' || OBJECT_NAME || ' COMPILE;' SCRIPT
FROM USER_OBJECTS
WHERE STATUS = 'INVALID'
AND OBJECT_TYPE <> 'PACKAGE BODY'
UNION ALL
SELECT 'ALTER PACKAGE ' || OBJECT_NAME || ' COMPILE BODY;' SCRIPT
FROM USER_OBJECTS
WHERE STATUS = 'INVALID'
AND OBJECT_TYPE = 'PACKAGE BODY';
