
- •Введение.
- •Соединение с бд 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.
- •Задача. Взятие последней записи о клиенте.
- •Задача. Отчет об изменениях зарплаты.
- •Задача. Пакет функций о вкладах.
- •Задача. Группировка лога выполнения процессов.
- •Задача. Вьюшка с аналитическими функциями по вкладам.
- •Задача. Календарь с аналитикой.
- •Задача. Поиск баланса счета на заданную дату.
- •Задача. Удаление исторических данных о рейтинге.
- •Функции, выдающие более одного значения.
- •Задача. Вызов многозначной функции.
- •"Расклейка" и "склейка" строк.
- •“Расклейка” одной строки.
- •“Расклейка” нескольких строк с группировкой.
- •“Склейка” в одну строку.
- •“Склейка” нескольких строк с группировкой.
- •Задача. Простая расклейка-склейка.
- •Задача. Скрипт создания индексов.
- •Задача. Скрипт создания таблиц.
- •Задача. Отчет о созданных объектах.
- •Задача. Отчет о числе строк в таблицах.
- •Задача. Расклейка списка хобби.
- •Задача. Склейка запроса о максимумах числовых полей.
- •Оптимизация запросов.
Троичная логика, конструкция with, функции nvl, coalesce, case, decode.
В Oracle для неопределенного/пустого значения в полях используется NULL. NULL может быть и результатом логического выражения. В Oracle имеет место троичная логика:
TRUE AND TRUE -> TRUE
TRUE AND FALSE -> FALSE
FALSE AND FALSE -> FALSE
TRUE AND NULL -> NULL
FALSE AND NULL -> FALSE
TRUE OR TRUE -> TRUE
TRUE OR FALSE -> TRUE
FALSE OR FALSE -> FALSE
TRUE OR NULL -> TRUE
FALSE OR NULL -> NULL
Подзапросы в Oracle можно именовать с помощью конструкции WITH и выносить в начало запроса.
Этот запрос демонстрирует использование функций nvl, coalesce, case, decode:
with a as
(select null f1, null f2, 1 f3, 2 f4, 3 f5 from dual)
select nvl(f1, f3), -- выдать первый аргумент, а, если он IS NULL, то второй аргумент
nvl(f4, f5),
coalesce(f1, f2, f3, f4), -- выдать первый NOT NULL аргумент из списка
case
when f2 is null then
f3
when f4 = 2 then
f5
else
0
end, -- выдача результата по первому совпавшему условию
decode(f1, null, 7, 8, 9, 0) -- упрощенная запись case when f1 is null then 7 when f1 = 8 then 9 else 0 end
from a;
Основы pl/sql.
Помимо SQL команд, таких как select, insert, update, delete, в Oracle есть возможность писать блоки кода, которые выполняют целый ряд действий. Такие блоки кода пишутся на языке PL/SQL и называются PL/SQL блоками. Приведем примеры.
Вот анонимный блок. Он состоит из трех частей: объявление переменных, выполняемый код и обработка исключений:
declare
i integer;
begin
select count(1) into i from dual;
exception when others then
null;
end;
Вот пример простейшей функции, написанной на PL/SQL:
create or replace function kk_dual_count return integer as
i integer;
begin
select count(1) into i from dual;
return i;
end kk_dual_count;
Выборка значения функции:
select kk_dual_count from dual;
Задача. Факториал.
Реализовать pl/sql функцию, считающую факториал числа.
Решим задачу двумя способами, заодно познакомимся с понятием функции и увидим синтаксис простейших функций:
create or replace function kk_factorial(n in integer) return integer is
f integer := 1;
begin
for i in 1 .. n loop
f := f * i;
end loop;
return f;
end kk_factorial;
create or replace function kk_factorial_recursive(n in integer)
return integer is
begin
if n = 0 then
return 1;
else
return n * kk_factorial_recursive(n - 1);
end if;
end kk_factorial_recursive;
Проверим результаты:
select kk_factorial(0),
kk_factorial_recursive(0),
kk_factorial(1),
kk_factorial_recursive(1),
kk_factorial(3),
kk_factorial_recursive(3),
kk_factorial(5),
kk_factorial_recursive(5)
from dual;
Задача. Подсчет числа вхождений символа в строку.
С помощью substr и instr написать pl/sql функцию, которая считает число вхождений буквы 'A' в строку.
Решим задачу разными способами:
Сканирование строки:
create or replace function kk_kol(a in varchar2) return integer is
res integer;
begin
res := 0;
for i in 1 .. length(a) loop
if substr(a, i, 1) = 'A' then
res := res + 1;
end if;
end loop;
return res;
end kk_kol;
Постепенное отсекание строки:
create or replace function kk_kol(a in varchar2) return integer is
res integer;
b varchar2(4000);
begin
res := 0;
b := a;
while instr(b, 'A') > 0 loop
res := res + 1;
b := substr(b, instr(b, 'A') + 1);
end loop;
return res;
end kk_kol;
Вычисление разности длины заданной строки и заданной строки с исключенными символами ‘A’:
create or replace function kk_kol(a in varchar2) return integer is
begin
return nvl(length(a), 0) - nvl(length(replace(a, 'A')), 0);
end kk_kol;
Возможны и многие другие способы.
Вызываем и проверяем:
select kk_kol('232'),
kk_kol('A232'),
kk_kol('2A32'),
kk_kol('232A'),
kk_kol('2AA32'),
kk_kol('2AA3A2'),
kk_kol('2AA3AA2'),
kk_kol('AA232'),
kk_kol('AA2AAfasdgfAAAAAAAdfsadg32'),
kk_kol('Adfsdf234123AA232AAA'),
kk_kol('232AAA'),
kk_kol('2A3A2'),
kk_kol('AAAA'),
kk_kol('2AA2')
from dual;