
- •Введение.
- •Соединение с бд 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.
- •Задача. Взятие последней записи о клиенте.
- •Задача. Отчет об изменениях зарплаты.
- •Задача. Пакет функций о вкладах.
- •Задача. Группировка лога выполнения процессов.
- •Задача. Вьюшка с аналитическими функциями по вкладам.
- •Задача. Календарь с аналитикой.
- •Задача. Поиск баланса счета на заданную дату.
- •Задача. Удаление исторических данных о рейтинге.
- •Функции, выдающие более одного значения.
- •Задача. Вызов многозначной функции.
- •"Расклейка" и "склейка" строк.
- •“Расклейка” одной строки.
- •“Расклейка” нескольких строк с группировкой.
- •“Склейка” в одну строку.
- •“Склейка” нескольких строк с группировкой.
- •Задача. Простая расклейка-склейка.
- •Задача. Скрипт создания индексов.
- •Задача. Скрипт создания таблиц.
- •Задача. Отчет о созданных объектах.
- •Задача. Отчет о числе строк в таблицах.
- •Задача. Расклейка списка хобби.
- •Задача. Склейка запроса о максимумах числовых полей.
- •Оптимизация запросов.
Задача. Простой пакет.
Создать пакет с функцией и процедурой из задачи “Процедура с OUT параметрами”.
Пакеты в Oracle создаются для группировки объектов по тематике использования.
Создадим заголовок пакета:
CREATE OR REPLACE PACKAGE KK_PKG1 IS
FUNCTION KK_F(IN_STR IN VARCHAR2, IN_CHAR IN CHAR) RETURN INTEGER;
PROCEDURE KK_P(IN_LASTNAME IN VARCHAR2,
IN_FIRSTNAME IN VARCHAR2,
OUT_NUM_A_IN_LASTNAME OUT INTEGER,
OUT_NUM_B_IN_FIRSTNAME OUT INTEGER);
END KK_PKG1;
Создадим тело пакета:
CREATE OR REPLACE PACKAGE BODY KK_PKG1 IS
FUNCTION KK_F(IN_STR IN VARCHAR2, IN_CHAR IN CHAR) RETURN INTEGER IS
RES INTEGER;
BEGIN
RES := 0;
FOR I IN 1 .. LENGTH(IN_STR) LOOP
IF SUBSTR(IN_STR, I, 1) = IN_CHAR THEN
RES := RES + 1;
END IF;
END LOOP;
RETURN RES;
END KK_F;
PROCEDURE KK_P(IN_LASTNAME IN VARCHAR2,
IN_FIRSTNAME IN VARCHAR2,
OUT_NUM_A_IN_LASTNAME OUT INTEGER,
OUT_NUM_B_IN_FIRSTNAME OUT INTEGER) IS
BEGIN
OUT_NUM_A_IN_LASTNAME := KK_PKG1.KK_F(UPPER(IN_LASTNAME), 'А');
OUT_NUM_B_IN_FIRSTNAME := KK_PKG1.KK_F(UPPER(IN_FIRSTNAME), 'Б');
END KK_P;
END KK_PKG1;
Проверим работу:
declare
n1 integer := 0;
n2 integer := 0;
begin
DBMS_OUTPUT.enable;
KK_PKG1.kk_p('Анатольев', 'Борис', n1, n2);
DBMS_OUTPUT.put_line('Анатольев Борис ' || n1 || ' ' || n2);
KK_PKG1.kk_p('Робин', 'Барабек', n1, n2);
DBMS_OUTPUT.put_line('Робин Барабек ' || n1 || ' ' || n2);
KK_PKG1.kk_p('Атанбаев', 'Ибрагим', n1, n2);
DBMS_OUTPUT.put_line('Атанбаев Ибрагим ' || n1 || ' ' || n2);
end;
Задача. Разные виды Count.
По виртуальной таблице, заданной в подзапросе WITH, выполнить различные виды функции count().
Напишем такой запрос, чтобы продемонстрировать, чем отличаются count(c), count(*), count(1) и count(distinct c):
with cc as
(select null c
from dual
union all
select null c
from dual
union all
select 1 c
from dual
union all
select 1 c
from dual
union all
select 2 c from dual)
select count(c), count(*), count(1), count(distinct c) from cc;
Итак, при явном указании имени поля в count() пустые поля в расчет не принимаются.
Database links.
Для связи между базами используются database link-и:
Создадим database link. Здесь STORAGE - пользователь(схема), 'ora' - база данных, "здесь_пароль_не_скажу_какой" - пароль:
create database link QUORUM_LINK connect to STORAGE identified by "здесь_пароль_не_скажу_какой" using 'ora';
Вот таким образом можно извлекать данные из таблицы на удаленном сервере, доступном через database link:
select * from quorum.pro@quorum_link;
Задача. Получение скрипта заполнения таблицы имеющимися данными.
Получить по таблице с полями типов Number, Varchar2 и Date скрипт, который заполняет ее уже имеющимися в ней данными.
Cоздадим таблицу:
CREATE TABLE KK_TST (ID INTEGER, VAL VARCHAR2(100), DT DATE);
Заполним ее тестовыми строками:
insert into kk_tst(id, val, dt) values(11, 'aaa', to_date('23.01.2012','dd.mm.yyyy'));
insert into kk_tst(id, val, dt) values(23, 'dsk', to_date('21.02.2012','dd.mm.yyyy'));
insert into kk_tst(id, val, dt) values(46, 'u8i', to_date('03.03.2012','dd.mm.yyyy'));
Этот запрос решает задачу:
select 'insert into kk_tst(id, val, dt) values(' || id || ', ''' || val ||
''', ' || 'to_date(''' || to_char(dt, 'dd.mm.yyyy') ||
''', ''dd.mm.yyyy''));' as res
from kk_tst;
Теперь чуть усложним задачу - вставим в таблицу несколько пустых значений NULL:
insert into kk_tst(id, val, dt) values(null, 'dsk', to_date('21.02.2012','dd.mm.yyyy'));
insert into kk_tst(id, val, dt) values(46, null, to_date('03.03.2012','dd.mm.yyyy'));
insert into kk_tst(id, val, dt) values(67, '23d', null);
Этот запрос решает задачу с учетом возможных NULL-значений:
select 'insert into ' || 'kk_tst(id, val, dt) values(' ||
decode(id, null, 'null', id) || ',' ||
decode(val, null, 'null', '''' || val || '''') || ',' ||
decode(dt,
null,
'null',
'to_date(''' || to_char(dt, 'dd.mm.yyyy') ||
''', ''dd.mm.yyyy'')') || ');' as res
from kk_tst;
Подобные запросы полезны, если надо скопировать табличку с данными на другой сервер, к которому нет database link-а.