Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Новое на сайте
Топовые новости
Новое

Oracle (продолжение)


PARALLEL_ENABLE

Разрешается запуск подпрограммы в параллельной обработке запроса на SMP сервере или сервере с параллельными процессами. Это предложение применяется только к пользовательским функциям. (Не используйте переменные состояния сеанса и переменные пакетов, поскольку нельзя ожидать, что они будут совместно использоваться серверами с параллельной обработкой.) Обработку запросов с предложением PARALLEL_ENABLE можно регулировать при помощи следующих дополнительных предложений.

PARTITION имя_раздела BY {ANY j {HASH RANGE] (столбец [, …])

Определяется распределение входных данных по функциям с аргументами типа REF CURSOR. Этот параметр полезен при использовании табличных функций. Значение ANY разрешает случайное распределение. Вы можете ограничить процесс распределения определенным диапазоном (RANGE) или хеш-секцией (HASH), указанной в списке столбцов.

{ORDER | CLUSTER] BY (столбец […])

Проводится сортировка или кластеризация данных в параллельной обработке в соответствии со списком перечисленных через запятую столбцов. Предложение ORDER BY используется на сервере параллельного выполнения для локальной сортировки строк по списку столбцов. При использовании предложения CLUSTER BY сервер параллельного выполнения использует только ключевые значения, указанные в списке столбцов.

(PIPELINED | AGGREGATE} [USING [схема.] тип реализации]

При указании предложения PIPELINED результат выполнения табличной функции выводится итерациями, а не последовательно, как обычно выводятся данные типа VARRAY или вложенные таблицы. Это предложение применяется только к пользовательским функциям. Предложение PIPELINED USING типреализации применяется для внешних пользовательских функций, использующих такие языки, как С++ и Java. Предложение AGGREGATE USING типреализации определяет пользовательскую функцию как агрегатную (то есть такую, которая проводит вычисления по многим строкам, но выводит только одно значение).

ISAS

Ключевые слова IS и AS в Oracle идентичны. Любое из них начинает блок_кода. блок_кода

Платформа Oracle позволяет использовать для пользовательских функций и записанных процедур блоки кода PL/SQL. В качестве альтернативы (для записанных процедур на Java и С) вы можете использовать предложение LANGUAGE.

LANGUAGE (JAVA NAME имя_внешней_программы | С [имя_внешней_программы] LIBRARY имя библиотеки [AGENT IN (аргумент) [WITH CONTEXT] [PARAMETERS (параметры)]}

Определяется реализация внешней программы на Java или С. Параметры и семантика объявлений специфичны для Java и С, а не для SQL.

ALTER (FUNCTION | PROCEDURE} [схема.]имя_объекта

Перекомпилируется неработающая самостоятельная подпрограмма. Чтобы изменить объявления, аргументы и определения в существующей подпрограмме, используйте конструкцию CREATE… OR REPLACE.

COMPILE [DEBUG] [REUSE SETTINGS]

Подпрограмма перекомпилируется. Заметьте, что компиляция необходима. (Увидеть ошибки компиляции можно с помощью команды SQL*Plus SHOW ERRORS.) Подпрограмма помечается как рабочая, если не происходит ошибок компиляции. В предложение COMPILE можно включать следующие дополнительные предложения.

DEBUG

Генерируется и записывается код, который используется отладчиком PL/SQL. параметр компилятор а — значение […]

Указывается параметр компилятора PL/SQL. Допустимы следующие параметры: PLSQL_OPTIMIZE_LEVEL, PLSQL_CODE_TYPE, PLSQLDEBUG, PLSQLJYARNINGS и NLS_LENGTH_SEMANTICS. За подробностями обращайтесь к документации по компилятору PL/SQL.

REUSE SETTINGS

Сохраняет существующие командные переключатели настроек компилятора и использует их при перекомпиляции. В обычных условиях Oracle удаляет настройки компилятора и получает их заново.

В Oracle пользовательские функции и записанные процедуры очень сходны по структуре и составу. Главное отличие состоит в том, что записанная процедура не может возвращать значение вызвавшему ее процессу, а функция возвращает вызвавшему процессу одно значение.

Например, можно передать следующей функции название подрядного проекта и получить величину прибыли этого проекта.

CREATE OR REPLACE FUNCTION project_revenue (project IN varchar2)
RETURN NUMBER AS proj_rev NUMBER(10.2);
BEGIN
SELECT SUM(DECODE(action, -COMPLETED’, amount, 0)) — SUM(DECODE(action, ‘STARTED’, amount, 0)) +
SUM(DECODE(action, ‘PAYMENT’, amount, 0))
INTO proj_rev FROM construction_actions WHERE project_name=project; RETURN (proj_rev);
END;

В данном примере пользовательская функция принимает в качестве аргумента название проекта. Затем она осуществляет подсчет прибыли проекта (project revenue), вычитая первоначальные затраты из платежа по завершении и добавляя к результату дополнительные платежи. Строка RETURN (PROJJREV) возвращает итоговый результат в вызвавший процесс.

В Oracle пользовательские функции нельзя использовать в следующих ситуациях.

В ограничениях типа CHECK или DEFAULT инструкций CREATE TABLE или ALTER TABLE.

В инструкциях SELECT, INSERT, UPDATE или DELETE пользовательские функции прямо или косвенно (то есть будучи вызванными из другой подпрограммы) не могут:

  • иметь параметр типа OUT или IN OUT (в непрямых вызовах параметры OUT или IN OUT использовать можно);
  • завершать транзакцию командами COMMIT, ROLLBACK, SAVEPOINT или использовать инструкции CREATE, ALTER и DROP, которые неявно используют команды COMMIT или ROLLBACK;
  • использовать инструкции управления сеансом (SET ROLE) или управления системой (специфическая для Oracle инструкция ALTER SYSTEM);
  • производить запись в базу данных (если являются компонентом инструкции SELECT или параллелизованных инструкций INSERT, UPDATE или DELETE); производить запись в таблицу, измененную инструкцией, которая вызвала пользовательскую функцию.

Обратите внимание, что, когда вы перекомпилируете подпрограмму с помощью инструкции ALTER, она помечается как работающая, если не возникает ошибок компиляции. (Если ошибки встречаются, она помечается как неработающая.) Вероятно, еще более важным является то, что объекты, которые зависят от перекомпилированной подпрограммы, также помечаются как неработающие независимо от того, возникала ли ошибка компиляции. Вы можете либо перекомпилировать зависимые объекты самостоятельно, либо позволить платформе потратить некоторое время и перекомпилировать их во время работы.

В качестве примера следующая инструкция перекомпилирует функцию project_revenue и сохранит информацию, полученную компилятором, для отладчика PL/SQL.

Источник