(no subject)

Nov 10, 2003 09:00

Дочитал Урмана. На что обратил внимание, что узнал нового, что показалось полезным...


Переменные подстановки (substitution variable) -- обозначаются "&" (можно изменить командой "set define") -- перед посылкой серверу производится полная текстовая замена переменной. Память реально не выделяется.

Встроенная функция DUMP:
select dump(sysdate) from dual;

DUMP(SYSDATE)
--------------------------------------------------------------------------------
Typ=13 Len=8: 7,212,4,12,20,39,38,0

select dump('ab') from dual;

DUMP('AB')
-------------------
Typ=96 Len=2: 97,98

Параметры IN передаются по ссылке, параметры IN OUT и OUT -- по значению.
NOCOPY -- указание передавать параметр по ссылке (указание компилятору, а не директива, не всегда принимается).

Пометить пакет как многократно используемый (пакет будет храниться в SGA, а не в UGA)
PRAGMA SERIALLY_REUSABLE;

Определить процедуру, пакет или объект с правами вызывающего или справами определяющего (для разрешения внешних ссылок)
AUTHID {CURRENT_USER | DEFINER}

Задать уровень строгости для пакетной функции по умолчанию
PRAGMA RESTRICT_REFERENCES(DEFAULT, WNDS...);
Ключевое слово TRUST

LRU -- least reacently used (использовавшийся наиболее давно)
Пакет DBMS_SHARED_POOL позволяет закреплять пакеты в разделяемом пуле.
DBMS_SHARED_POOL.SIZES -- вывести содержимое разделяемого пула.

PLS-123: program too large
* число узлов в дереве Diana (2^15 до 8i, 2^26 в 8i -- для тел пакетов и типов) -- пропорционально числу строк в коде
* 21к -- число временных переменных, генерируемых компилятором
* 32к -- число точек входа (процедур и функций)
* 2^32 -- число символов в элементе PL/SQL

DETERMINISTIC -- ключевое слово для функции, которая для одинаковых входных данных возвращает один и тот же результат и не имеет серьёзного побочного эффекта (функцию не надо вызывать несколько раз, если аргументы те же).
* все функции, кот. исп. в индексе, д. б. детерминированными.
* для материализированного VIEW
* в snapshot
* для использования в WHERE, ORDER BY, GROUP BY

PARALLEL_ENABLE -- если нет обращения к пакетным переменным, операторов DML

Триггеры:
* DML
* системные (на событие: запуск/остановка БД, регистрация/отключение пользователя, CREATE, ALTER, DROP)
* "вместо" (только для VIEW -- реляционных или объектных -- вызывается вместо операторов DML -- это всегда строковые триггеры)
Тело триггера не может превышать 32к.
До PL/SQL 2.1 (Oracle 7.1) для таблицы можно было создать максимум 12 триггеров -- по одному каждого вида.
В 8i триггер может активизироваться и для столбца вложенной таблицы
Порядок активизации триггера DML:
* выполняются операторные триггеры BEFORE
* для каждой строки, на которую воздействует оператор
* выполняется строковый триггер BEFORE
* выполняется собственно оператор
* выполняется строковый триггер AFTER
* выполняются операторные триггеры AFTER
Идентификаторы корреляции:
* :old
* :new
* :parent (8i) -- текущая строка родительской таблицы для вложенной таблицы
Системные триггеры практически всегда завершаются оператором COMMIT

У процедур, пакетов и таблиц одно и то же пространство имён. У триггеров собственное пространство имён.

В триггерах нельзя
* использовать операторы управления транзакциями
* объявлять переменные типа LONG, LONG RAW
* модифицировать значение столбцов LOB

Тело триггера может состоять из оператора CALL (для вызова внешней процедуры C, Java или хранимой процедуры PL/SQL)

UTL_FILE
С помощью UTL_FILE невозможно выводить информацию в двоичные файлы (считывать можно в объект BFILE)
FCLOSE_ALL закрывает файлы и высвобождает ресурсы, но не помечает файлы как закрытые.
VIEW модифицируемое, если не содержит:
* UNION, UNION ALL, MINUS...
* SUM, AVG, ..
* GROUP BY, CONNECT BY, START WITH...
* DISTINCT
* joins

DBMS_SQL
Можно обрабатывать операторы трёх видов:
* DML, DDL, ALTER SESSION
* запросы
* анонимные блоки PL/SQL

Новые возможности:
* SQL-оператор большого размера можно передавать через индексную таблицу PL/SQL
* BIND_ARRAY, DEFINE_ARRAY (привязка больших объёмов)
* привязка больших объектов
* RETRUNING (например, позволяет узнать ID вновь введённой строки)
* CALL для вызова хранимых процедур
* DESCRIBE_COLUMNS для описания списка выбора

Информационные функции
* LAST_ERROR_POSITION -- смещение в байтах в SQL-операторе
* LAST_ROW_COUNT -- общее число строк, считанных в курсоре до вызова этой ф-ии
* LAST_ROW_ID -- ID последней обработанной строки
* LAST_SQL_FUNCTION_CODE -- код ф-ии для SQL-оператора, исполняемого в текущий момент (надо вызывать сразу после вызова EXECUTE)
* IS_OPEN -- открыт ли курсор

Внутренний (встроенный) динамический SQL:
* EXECUTE IMMEDIATE lsqlStr;
* OPEN FOR
Работает быстрее, чем DBMS_SQL.

Функции пакета DBMS_SQL исполняются с правами вызывающего.

Внешние подпрограммы C выполняются отдельным процессом extproc и не имеют прямого доступа к памяти SGA
CREATE LIBRARY

Привязка больших объёмов данных (bulk binds).
bulk-collect
FORALL

Автономные транзакции

ALTER SESSION SET NLS_DATE_FORMAT = 'dd.mm.rr hh24:mi';

Объектные типы
RETURNING

DBMS_RANDOM -- пакет для выдачи случайных чисел.
DBMS_UTILITY.FORMAT_ERROR_STACK
DBMS_UTILITY.PORT_STRING

VIEW ALL_UNUSED_COL_TABS

Previous post Next post
Up