Использование DBMS_METADATA
Часто в работе возникают ситуации , когда необходимо посмотреть исходный код DLL обьекта , а специальных графических средств нет под рукой
в этом нам поможет пакет DBMS_METADATA и метод GET_DDL
DBMS_METADATA.GET_DDL -- входные параметры
object_type - Тип обьекта (TABLESPACE, CONSTRAINT , CONSTRAINT, Index)
name - Наименование обьекта например : USERS
schema - схема , по умолчанию схема сессии пользователя или SYS
приведем некоторые примеры
-- извлечь исходный код для табличного пространства USERS
select DBMS_METADATA.GET_DDL('TABLESPACE','USERS') from dual /* CREATE TABLESPACE "USERS" DATAFILE '/path/users01.dbf' SIZE 52000 AUTOEXTEND ON NEXT 130000 MAXSIZE 32007M LOGGING ONLINE PERMANENT BLOCKSIZE 8192 EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO ALTER DATABASE DATAFILE '/path/users01.dbf' RESIZE 917504000 */
Model. SQL - высший пилотаж , имитация Excel
Оператор sql Model позволяет рассматривать результат запроса как многомерный массив
при этом в SQL задаем оси измерения этого массива (идентифицируем данные по осям)
использование Model, так же позволит нам подводить промежуточные и общие итоги, с применением агрегатных функции
SELECT * FROM table1 -- таблица или запрос MODEL DIMENSION BY (field1 , field2, ..)--оси, определение осей измерений по которым мы строим массив (поля для поиска уникальной ячейки) MEASURES (field3) -- определяющее поле RULES ( cnt['res1', 'res2'] = res3 -- результат который вносится массив ) ORDER BY field1; -- сортировка по полю
Конструкция MERGE, вставка - обновление
Назначение
Позволяет дополнять и обновлять данные одной таблицы - данными другой таблицы. При слиянии таблиц проверяется условие, и если оно истинно, то выполняется Update, а если нет - Insert. Причем нельзя изменять поля таблицы в секции Update, по которым идет связывание двух таблиц.
Является командой DML!
Синтаксис
MERGE INTO TABLE_NAME USING table_reference ON (condition) WHEN MATCHED THEN UPDATE SET column1 = value1 [, column2 = value2 ...] WHEN NOT MATCHED THEN INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...) ;
Создание табличной (pipelined) функции с помощью динамического SQL запроса в ORACLE
Иногда возникает необходимость вернуть результат некоторой функции с на основе запроса сформированного динамически, во время выполнения функции.
Продемонстрируем как это сделать.
Подготовим тестовый запрос - пусть это будет запрос из таблицы all_objects
select o.OBJECT_NAME, o.OBJECT_TYPE from all_objects o where upper(object_name) like upper('t%') and rownum < 35
Определим типы возвращаемых данных
Аналитический SQL Oracle за 20 минут
Применяется в основном для отчетности , для следующих типов задач
1. Запросы рейтингов, первых N
2. Запросы с накопительным итогом
3. Запросы с конструкцией окна
4. Может применяться и для оптимизации запросов
Какие бывают функции в аналитическом, разберём основные
ROW_NUMBER() – номер строки в группе
LAG(f, n,m) –f имя поля, n предыдущее значение в группе, m – знач по умолчанию
LEAD(f, n,m) -f имя поля, n последующее значение в группе, m – знач по умолчанию
FIRST_VALUE(f) – f имя поля, первое значение в группе ,