
- •Введение.
- •Соединение с бд 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 перечень имен всех объектов текущей схемы (не только начинающихся с 'kk_'). С помощью конструкции sql%rowcount выдать в dbms_output количество вставившихся строк.
- •Задача. Удаление всех таблиц и вьюшек.
- •Часть 1. Написать pl/sql блок, который дропает все таблицы текущей схемы, начинающиеся на 'kk_'.
- •Часть 2. Написать pl/sql блок, который выдает в dbms_output скрипт удаления всех вьюшек текущей схемы, начинающихся с 'vw_kk%'.
- •Задача. Отчет о максимальных id.
- •Задача. Переименование столбцов.
- •Задача. Создание вьюшек.
- •Триггеры.
- •Задача. Автоинкрементное поле.
- •Задача. Триггер конвертации сумм в валюте.
- •Задача. Триггер логирования dml-операций.
- •Задача. Триггер зеркалирования.
- •Задача. Триггер по поиску в справочнике.
- •Задача. Триггер контроля.
- •Global temporary tables и переменные в заголовке пакета.
- •Переменные в заголовке пакета.
- •Регулярные выражения.
- •Задача. Правка некачественных данных регулярными выражениями.
- •Задача. Парсинг строк с помощью регулярных выражений.
- •Автономные транзакции.
- •Задача. Автономное логирование этапов загрузки.
- •Иерархические запросы.
- •Задача. Вывод иерархии с отступами.
- •Задача. Соединение иерархической таблицы с обычной.
- •Задача. Сумма зарплат подчиненных.
- •Задача. Простой календарь.
- •Задача. Детальный календарь.
- •Задача. Календарь с индикаторами выходных дней.
- •Аналитические функции.
- •Отступление о Rownum.
- •Негрупповые аналитические функции.
- •Групповая функция keep dense_rank.
- •Задача. Взятие последней записи о клиенте.
- •Задача. Отчет об изменениях зарплаты.
- •Задача. Пакет функций о вкладах.
- •Задача. Группировка лога выполнения процессов.
- •Задача. Вьюшка с аналитическими функциями по вкладам.
- •Задача. Календарь с аналитикой.
- •Задача. Поиск баланса счета на заданную дату.
- •Задача. Удаление исторических данных о рейтинге.
- •Типы данных clob и blob.
- •Функции, выдающие более одного значения.
- •Задача. Вызов многозначной функции.
- •Материализованные вьюшки
- •"Расклейка" и "склейка" строк.
- •“Расклейка” одной строки.
- •“Расклейка” нескольких строк с группировкой.
- •“Склейка” в одну строку.
- •“Склейка” нескольких строк с группировкой.
- •Задача. Простая расклейка-склейка.
- •Задача. Скрипт создания индексов.
- •Задача. Скрипт создания таблиц.
- •Задача. Отчет о созданных объектах.
- •Задача. Отчет о числе строк в таблицах.
- •Задача. Расклейка списка хобби.
- •Задача. Склейка запроса о максимумах числовых полей.
- •Ретроспективные запросы.
- •Оптимизация запросов.
Функции по работе с датами.
Под датой будем понимать дату со временем.
Текущая дата на сервере - sysdate. Даты можно задавать в формате с маской, например:
select sysdate,
to_date('31.01.2012 22:56:17', 'dd.mm.yyyy hh24:mi:ss'),
to_date('2012-03-08', 'yyyy-mm-dd')
from dual;
Даты можно вычитать, в результате выйдет число, равное количеству дней между датами.
К дате можно прибавить число, в результате выйдет дата, увеличенная на количество дней, заданное прибавляемым числом.
Даты нельзя складывать, умножать и делить.
Продемонстрируем операции над датами:
select sysdate + 1, /* текущая дата + 1 день */
sysdate - 1.5, /* текущая дата - 1.5 дня */
sysdate + 1 / 24 / 60, /* текущая дата + 1 минута */
dt, /* dt из подзапроса */
sysdate - dt, /* разность sysdate и dt в днях */
trunc(sysdate), /* округлили sysdate до целых дней, отбросив часы, минуты и секунды */
trunc(dt, 'yyyy'), /* взятие первого дня года, к которому относится dt */
trunc(dt, 'mm'), /* взятие первого дня месяца, к которому относится dt */
trunc(dt, 'dd'), /* округление dt до дней */
trunc(sysdate, 'iw'), /* взятие первого дня недели, к которому относится dt */
to_char(sysdate, 'iw'), /* номер недели в году по мнению Oracle */
to_char(dt, 'WW'), /* номер недели в году, причем первой неделей считаются первые семь дней с начала года */
to_char(sysdate, 'w'), /* номер недели в месяце по мнению Oracle */
to_char(sysdate, 'd'), /* номер дня недели (зависит от NLS_TERRITORY) */
to_char(sysdate, 'DY'), /* название дня недели (зависит от NLS_DATE_LANGUAGE) */
to_char(sysdate, 'DAY'), /* полное название дня недели (зависит от NLS_DATE_LANGUAGE) */
to_char(sysdate, 'MON'), /* название месяца (зависит от NLS_DATE_LANGUAGE) */
to_char(sysdate, 'MONTH'), /* полное название месяца (зависит от NLS_DATE_LANGUAGE) */
to_char(dt, 'yyyy/mm/dd'), /* приведение даты к строковому типу согласно заданной маске */
to_char(dt, 'dd-mon-yyyy', 'NLS_DATE_LANGUAGE=''AMERICAN'''), /* приведение даты к строковому типу согласно заданной маске по-американски */
to_char(dt, 'dd-mon-yyyy', 'NLS_DATE_LANGUAGE=''RUSSIAN'''), /* приведение даты к строковому типу согласно заданной маске по-русски */
to_char(dt), /* без маски зависит от NLS_DATE_FORMAT */
to_char(to_date('27-oct-98',
'dd-mon-rr',
'NLS_DATE_LANGUAGE=''AMERICAN'''),
'yyyy'), /* mon - это еще один формат месяца, rr - формат года, отнесение которого в какому-либо веку доверяешь Oracle */
to_char(to_date('27-jan-17',
'dd-mon-rr',
'NLS_DATE_LANGUAGE=''AMERICAN'''),
'yyyy'), /* 98 - 1998 год, 17 - 2017 год */
to_char(sysdate, 'yy'), /* последние 2 цифры года */
add_months(dt, 1), /* добавление к дате 1 месяца (по мнению Oracle) */
add_months(dt, -1.5), /* если второй параметр не целый, Oracle его округляет */
months_between(to_date('30.11.2012', 'dd.mm.yyyy'),
to_date('31.01.2012', 'dd.mm.yyyy')) /* количество месяцев между датами (по мнению Oracle) */,
months_between(to_date('29.02.2012', 'dd.mm.yyyy'),
to_date('28.01.2012', 'dd.mm.yyyy')) /* еще одно количество месяцев между датами (по мнению Oracle) */,
extract(year from sysdate) /* выделили год из sysdate */,
extract(month from sysdate) /* выделили год из sysdate */,
extract(day from sysdate) /* выделили день из sysdate */
from (select to_date('03.02.2012 22:56:17', 'dd.mm.yyyy hh24:mi:ss') dt
from dual);
Предлагается выполнить этот запрос с различными настройками сессии и всмотреться в различия:
Вариант 1:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'AMERICAN';
Вариант 2:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YYYY';
ALTER SESSION SET NLS_TERRITORY = 'CIS';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'RUSSIAN';
Отметим, что из-за такого пестрого набора возможных настроек следует при работе с датой использовать маску, т.е. не лениться писать
dt := to_date('24.12.2012', 'DD.MM.YYYY')
вместо варианта
dt := '24.12.2012'
, который не всегда работает.
Также NLS-настройки, действующие по умолчанию, можно прописывать на уровне базы, в переменных среды windows и в реестре.