
- •Введение.
- •Соединение с бд 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.
- •Задача. Взятие последней записи о клиенте.
- •Задача. Отчет об изменениях зарплаты.
- •Задача. Пакет функций о вкладах.
- •Задача. Группировка лога выполнения процессов.
- •Задача. Вьюшка с аналитическими функциями по вкладам.
- •Задача. Календарь с аналитикой.
- •Задача. Поиск баланса счета на заданную дату.
- •Задача. Удаление исторических данных о рейтинге.
- •Функции, выдающие более одного значения.
- •Задача. Вызов многозначной функции.
- •"Расклейка" и "склейка" строк.
- •“Расклейка” одной строки.
- •“Расклейка” нескольких строк с группировкой.
- •“Склейка” в одну строку.
- •“Склейка” нескольких строк с группировкой.
- •Задача. Простая расклейка-склейка.
- •Задача. Скрипт создания индексов.
- •Задача. Скрипт создания таблиц.
- •Задача. Отчет о созданных объектах.
- •Задача. Отчет о числе строк в таблицах.
- •Задача. Расклейка списка хобби.
- •Задача. Склейка запроса о максимумах числовых полей.
- •Оптимизация запросов.
Функции по работе со строками.
Строки в Оracle нумеруются с 1, а не с 0, как в некоторых изысканных языках.
Нижеприведенный запрос демонстрирует работу с некоторыми строковыми функциями. Для запроса “из ниоткуда” используется таблица DUAL, которая всегда есть в Oracle и всегда имеет единственную запись:
select substr('wqeqwe', 2, 3), -- подстрока, начиная со 2ой позиции 3 символа
substr('wqeqwe21', 3), -- подстрока, начиная со 3ой позиции до конца
substr('wqeqwe11', -5, 3), -- подстрока, начиная с 5ой с конца позиции 3 символа
substr('wqeqwe11', -4), -- подстрока, начиная с 4ой с конца позиции до конца
instr('abcdefcdr', 'cd'), -- позиция первого вхождения подстроки 'cd' в строку 'abcdefcdr'
instr('abcdef', 'cdr'), -- позиция первого вхождения отсутствующей подстроки 'cdr' в строку 'abcdef' принимается за 0
instr('abcdefcdr', 'cd', 5), -- позиция первого вхождения подстроки 'cd' в строку 'abcdefcdr' (поиск начинается с 5ой позиции)
replace('QRWTERTYRTY', 'RT', '1'), -- замена подстрок 'RT' на подстроки '1'
replace('QRWTERTYRTY', 'RT'), -- исключение подстрок 'RT'
translate('decfbcdar', 'abcj', '1234'), -- замена символов согласно строкам, задающим посимвольное сопоставление
translate('abcdefcdr', 'abefr', ' '), -- замена ненужных символов на пробелы
replace(translate('abcdefcdr', 'abefr', ' '), ' '), -- заменили ненужные символы на пробелы, а потом убрали их совсем
ascii('A'), -- ascii-код символа 'A'
ascii(' '), -- ascii-код пробела
ascii('Ы'), -- ascii-код символа 'Ы'
ascii('ЫИ\атц325'), -- ascii-код последовательности принимается равным ascii-коду первого символа этой последовательности
chr('70'), -- символ с кодом 70
chr('134'), -- символ с кодом 134
'фыва' || ' ' || 'пролджэ', -- конкатенация 3 строк
upper('aAa'), -- приведение строки к верхнему регистру
lower('aAa'), -- приведение строки к нижнему регистру
ltrim('aaaaa32a34 324', 'a'), -- убрали символы 'a' слева
ltrim(' 3234a3 24'), -- убрали пробелы слева
rtrim('323a 4324aaa', 'a'), -- убрали символы 'a' справа
rtrim('32a34 324 '), -- убрали пробелы справа
trim(' 323aa43 24 '), -- убрали пробелы слева и справа
lpad('abcdef', 10, '0'), -- дополнили строку слева до длины 10 символов символами '0'
lpad('abcdef', 10), -- дополнили строку слева до длины 10 символов пробелами
rpad('abcdef', 10, '0'), -- дополнили строку справа до длины 10 символов символами '0'
rpad('abcdef', 10), -- дополнили строку справа до длины 10 символов пробелами
reverse('Он дивен, палиндром, и ни морд, ни лап не видно') -- прочтение строки в обратном порядке
from dual;
Функции по работе с числами.
Данный запрос демонстрирует функции по работе с числами.
select round(4.13624, 2), -- округление до двух знаков после запятой
round(4.13324), -- округление до целого числа
trunc(323.63), -- целая часть числа
trunc(323.63234, 3), -- отсечение цифр после третьего знака после запятой
ceil(323.13), -- наименьшее целое, превосходящее данное
to_char(3.13684, '0.999'), -- приведение к шаблону
to_char(-3.13684, '0.999'), -- приведение к шаблону
to_char(3.13684, 'S0.999'), -- приведение к шаблону со знаком
to_char(-3.13684, 'S0.999'), -- приведение к шаблону со знаком
to_number('0,13624'), -- перевод строки в число (разделитель целой и дробной части задается настройками Oracle)
to_number(replace('0.13624', '.', ',')), -- меняем точку на запятую и переводим строку в число
to_number('0.13624', '0.99999'), -- перевод строки в число с заданным форматом
cast('0,13624' as number), -- еще один способ перевести строку в число
greatest(3, 2), -- наибольшее из набора чисел
least(3, 2, 7), -- наименьшее из набора чисел
mod(5, 3), -- остаток от деления 5 на 3
power(2, 10), -- 2 в степени 10
sign(-10), -- знак числа
sign(0), -- знак числа
sign(78), -- знак числа
to_number('82672389,234', '999999999D999', 'NLS_NUMERIC_CHARACTERS='', '''),
-- запятая - разделитель целой и дробной части, пробел - разделитель групп разрядов
to_number('82672389.234', '999999999D999', 'NLS_NUMERIC_CHARACTERS=''. '''),
-- точка - разделитель целой и дробной части, пробел - разделитель групп разрядов
to_number('82 672 389.234', '999G999G999D999', 'NLS_NUMERIC_CHARACTERS=''. ''')
-- точка - разделитель целой и дробной части, пробел - разделитель групп разрядов
from dual;