
- •Введение.
- •Соединение с бд 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.
- •Задача. Взятие последней записи о клиенте.
- •Задача. Отчет об изменениях зарплаты.
- •Задача. Пакет функций о вкладах.
- •Задача. Группировка лога выполнения процессов.
- •Задача. Вьюшка с аналитическими функциями по вкладам.
- •Задача. Календарь с аналитикой.
- •Задача. Поиск баланса счета на заданную дату.
- •Задача. Удаление исторических данных о рейтинге.
- •Функции, выдающие более одного значения.
- •Задача. Вызов многозначной функции.
- •"Расклейка" и "склейка" строк.
- •“Расклейка” одной строки.
- •“Расклейка” нескольких строк с группировкой.
- •“Склейка” в одну строку.
- •“Склейка” нескольких строк с группировкой.
- •Задача. Простая расклейка-склейка.
- •Задача. Скрипт создания индексов.
- •Задача. Скрипт создания таблиц.
- •Задача. Отчет о созданных объектах.
- •Задача. Отчет о числе строк в таблицах.
- •Задача. Расклейка списка хобби.
- •Задача. Склейка запроса о максимумах числовых полей.
- •Оптимизация запросов.
Задача. Подсчет числа вхождений подстроки в строку.
Написать pl/sql функцию, которая считает число вхождений в заданную строку заданной подстроки. Вариант 1 – с перекрытиями, т.е. kk_instr_count_cover('перерезать', 'ере') = 2. Вариант 2 – без перекрытий, т.е. kk_instr_count_nocover('перерезать', 'ере') = 1.
Создадим функцию по поиску подстроки с перекрытиями:
create or replace function kk_instr_count_cover(in_string in varchar2,
in_substring in varchar2)
return integer is
v_result integer := 0;
i integer;
begin
if in_string is null then
return 0;
end if;
for i in 1 .. length(in_string) loop
if instr(in_string, in_substring, i) = i then
v_result := v_result + 1;
end if;
end loop;
return v_result;
end kk_instr_count_cover;
Создадим функцию по поиску подстроки без перекрытий:
create or replace function kk_instr_count_nocover(in_string in varchar2,
in_substring in varchar2)
return integer is
v_result integer := 0;
v_str varchar2(4000);
begin
v_str := in_string;
while instr(v_str, in_substring) > 0 loop
v_result := v_result + 1;
v_str := substr(v_str,
instr(v_str, in_substring) + length(in_substring));
end loop;
return v_result;
end kk_instr_count_nocover;
Протестируем:
select kk_instr_count_cover('перерезать', 'ере'),
kk_instr_count_cover('тест', ''),
kk_instr_count_cover('тест', 'нет'),
kk_instr_count_cover('', ''),
kk_instr_count_cover('', 'лол'),
kk_instr_count_cover('ололололенька', 'оло'),
kk_instr_count_nocover('перерезать', 'ере'),
kk_instr_count_nocover('тест', ''),
kk_instr_count_nocover('тест', 'нет'),
kk_instr_count_nocover('', ''),
kk_instr_count_nocover('', 'лол'),
kk_instr_count_nocover('ололололенька', 'оло')
from dual;
Задача. Копирование таблицы фиксированной структуры.
Написать процедуру копирования всех строк из таблицы kk_smpl в таблицу kk_smpl_copy (такой же структуры).
Параметр процедуры – do_commit. Если do_commit = 0, то не коммитить, если do_commit = 1, то коммитить.
Поясню, что такое commit. Пока в сессии не сделан commit, произведенные изменения данных видны только в рамках этой сессии. Когда сделан commit, изменения посылаются на сервер и становятся видны во всех сессиях.
Командой, обратной команде commit, т.е. командой отката данных, является rollback.
Любая DDL-команда (команда изменения структуры данных) делает commit автоматически.
Создаем таблицы:
CREATE TABLE KK_SMPL
(
ID INTEGER,
DT DATE,
AMOUNT NUMBER(16, 2),
FULLNAME VARCHAR2(50),
PASSPORT CHAR(11)
);
insert into kk_smpl
(id, dt, amount, fullname, passport)
values
(1, sysdate, 34.7, 'Иванов', '2704 871905');
commit;
CREATE TABLE KK_SMPL_COPY
(
ID INTEGER,
DT DATE,
AMOUNT NUMBER(16, 2),
FULLNAME VARCHAR2(50),
PASSPORT CHAR(11)
);
Создаем процедуру копирования:
create or replace procedure kk_copy(do_commit in integer := 0) is
begin
insert into kk_smpl_copy
(id, dt, amount, fullname, passport)
select id, dt, amount, fullname, passport from kk_smpl;
if do_commit = 1 then
commit;
end if;
end kk_copy;
Вызываем процедуру копирования:
begin
kk_copy(1);
end;
Проверим результат:
select * from kk_smpl_copy;