
- •Введение.
- •Соединение с бд 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.
- •Задача. Взятие последней записи о клиенте.
- •Задача. Отчет об изменениях зарплаты.
- •Задача. Пакет функций о вкладах.
- •Задача. Группировка лога выполнения процессов.
- •Задача. Вьюшка с аналитическими функциями по вкладам.
- •Задача. Календарь с аналитикой.
- •Задача. Поиск баланса счета на заданную дату.
- •Задача. Удаление исторических данных о рейтинге.
- •Функции, выдающие более одного значения.
- •Задача. Вызов многозначной функции.
- •"Расклейка" и "склейка" строк.
- •“Расклейка” одной строки.
- •“Расклейка” нескольких строк с группировкой.
- •“Склейка” в одну строку.
- •“Склейка” нескольких строк с группировкой.
- •Задача. Простая расклейка-склейка.
- •Задача. Скрипт создания индексов.
- •Задача. Скрипт создания таблиц.
- •Задача. Отчет о созданных объектах.
- •Задача. Отчет о числе строк в таблицах.
- •Задача. Расклейка списка хобби.
- •Задача. Склейка запроса о максимумах числовых полей.
- •Оптимизация запросов.
Словарь данных.
Объекты Oracle можно смотреть в словаре данных в различных системных вьюшках.
Вьюшки по объектам своей схемы (по объектам пользователя, под которым сейчас залогинен) начинаются с префикса "user_".
Вьюшки по объектам всех схем начинаются с префикса "all_", а в остальном пишутся так же.
Вьюшки по объектам всех схем (с админскими) начинаются с префикса "dba_", а в остальном пишутся так же.
В нижеприведенных запросах можно поменять "user_" на "all_", чтобы делалась выборка по всем схемам.
При замене "user_" на "all_" во вьюшках добавляется поле OWNER (название схемы).
Важно понимать, что все объекты в словаре данных хранятся написанными большими буквами, если только при их создании не были использованы двойные кавычки, что делается редко.
select * from user_tables; -- все таблицы
select * from user_tab_columns where table_name = 'MY_TABLE'; -- Столбцы таблицы MY_TABLE, с порядком следования (column_id), типами данным, размерами. Обратите внимание, что в user_tab_columns также хранятся и столбцы вьюшек.
select * from user_source; -- код функций, процедур, пакетов, триггеров (хранятся построчно с указанием номеров строк)
select * from user_views; -- код вьюшек (тела вьюшек хранятся в поле text типа long)
select * from user_objects; -- все объекты
select * from user_segments; -- занимаемое таблицами и индексами место на диске
select * from user_tablespaces; -- тэйблспейсы (физические пространства для таблиц и индексов)
select * from user_indexes; -- индексы
select * from user_ind_columns; -- столбцы индексов
select * from user_synonyms; -- синонимы (дополнительные имена для объектов)
select * from user_db_links; -- database links
select * from user_constraints; -- констрейнты (о них далее будет глава)
select * from user_tab_partitions; -- партиции
select * from user_tab_subpartitions; -- субпартиции
Бывает, что таблица состоит из нескольких вложенных таблиц одинаковой структуры – партиций. Партиции в свою очередь могут содержать в себе субпартиции, то есть таблицы второго уровня вложенности. Третьего уровня вложенности не бывает. Разделение таблицы на партиции осуществляется согласно значениям определенного поля таблицы (по которому производится партиционирование). Отнесение каждой строки к конкретной партиции может осуществляться по интервалам (by range) или по перечню значений (by list), которые может принимать поле (по которому производится партиционирование). Пример использования партиций: таблица звонков абонентов сотовой сети с партиционированием по дате звонка (by range) и субпартиционированием по коду региона (by list). Предлагается посмотреть в боевой базе на какую-либо партиционированную таблицу и посмотреть на код создания таблицы.
select * from user_dependencies where name = 'PCK_XS'; -- какие объекты используются в объекте(пакете) PCK_XS
select * from user_dependencies where referenced_name = 'ST_CLIENTS'; -- какие объекты используют объект(таблицу) ST_CLIENTS
Взимозависимости объектов можно смотреть в PL/SQL Developer-е, раскрыв в дереве объектов узел с именем интересующего объекта, а затем раскрыв узлы “References” и “Referenced by”.