Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СУБД Oracle / Лекции / Лек_ORAC / LA / Создание пакетов.doc
Скачиваний:
45
Добавлен:
16.04.2013
Размер:
173.57 Кб
Скачать

V_message varchar2(50);

BEGIN

s := DBMS_PIPE.RECEIVE_MESSAGE(‘DEMO_PIPE’);

IF s <> 0 THEN

RAISE_APPLICATION_ERROR(-20200, ‘Error: ’ ||

TO_CHAR(s) || ‘reading pipe’);

END IF;

DBMS_PIPE.UNPACK_MESSAGE(v_message);

DBMS_OUTPUT.PUT_LINE(v_message);

END receive_message;

Функции пакета DBMS_PIPE

Процедура или функция

Описание

PACK_MESSAGE

Упаковывает элемент типа VARCHAR2,NUMBERилиDATEв локальный буфер сообщений для последующей отсылки функциейSEND_MESSAGE.

РАСК_МESSAGE_RAW

Упаковывает в локальный буфер несформи­рованный элемент (элемент типа RAW).

PACK_MESSAGE_ROWID

Упаковывает в локальный буфер сообщений элемент типа ROWID.

SEND_MESSAGE

Посылает сообщение из локального буфера в указанный программный канал. Если канала не существует, то неявно создает его.

RECEIVE_MESSAGE

Извлекает сообщение из программного канала в локальный буфер для последующей распаковки процедурой UNPACK.

UNPACK_MESSAGE

Распаковывает элемент типа VARCHAR2,NUMBERилиDATEиз локального буфера сообщений.

UNPACK_MESSAGE_RAW

Распаковывает несформированный элемент (элемент типа RAW) из локального буфера сообщений.

UNPACK_MESSAGE_ROWID

Распаковывает строку элемента из локального буфера сообщений.

NEXT_ITEM_TYPE

Получает тип следующего элемента в локальном буфере сообщений (0 - не содержит, 6 – NUMBER, 9 –VARCHAR2, 11 –ROWID, 12 –DATE, 23 –RAW).

UNIQUE_SESSION_NAME

Получает уникальное имя сеанса.

PURGE

Чистит указанный программный канал, удаляя его из SGA.

CREATE_PIPE

Создает указанный программный канал в SGA. Размер по умолчанию - 4К (4096). Можно создавать частные и общедоступные каналы.

Пакет DBMS_SQL

Позволяет выполнять DDLи позволяет выполнять динамическийSQL.

Особенности и характеристики:

  • Позволяет разработчикам не включать команды SQL в исходные программы, а хранить их в виде символьных строк, которые вводятся в программу или создаются программой во время выполнения. Следовательно, разработчики могут создавать процедуры более универсального назначения - например, для работы с таблицей, имя которой становится известным только в момент выполнения.

  • Позволяет сделать синтаксический разбор любого оператора DML или DDL, что решает проблему невозможности синтаксического разбора операторов DDL прямо в PL/SQL - например, для удаления таблицы из хранимой процедуры.

  • Использование пакета для выполнения операторов DDL может привести к зависанию программы.

  • Операции в этом пакете выполняются в соответствии с привилегиями текущего пользователя, а не владельца пакета SYS. Следовательно, если вызов производится из анонимного блока PL/SQL, операции выполняются в соответствии с привилегиями текущего пользователя. Если вызов производится из хранимой процедуры, операции выполняются в соответствии с привилегиями владельца хранимой процедуры.

  • В отличие от интерфейса OCI (OracleCallInterface), который связывает переменные по адресу, пакет DBMS_SQL делает это по имени.

  • Процедура DBMS_SESSION.SET_ROLE не оказывает воздействия на вложенные операторы SQL в хранимых процедурах, но влияет на выполнение SQL-команд в процедурах, если используется пакет DBMS_SQL.

Практическое применение

  • Можно выполнить процедуру, принимающую в качестве параметров имя таблицы, имя столбца и значение столбца.

  • Можно выполнить процедуру, которая берёт имена исходной и принимающей таблиц и копирует строки из первой таблицы во вторую.

Блок-схема вызова процедур DBMS_SQL.

  1. OPEN_CURSOR: для обработки команды SQL необходимо открыть курсор и получить логический дескриптор (handle), используемый в качестве идентификационного номера курсора.

  2. PARSE (синтаксический анализ): каждая SQL-команда должна быть подвергнута синтаксическому разбору (анализу) для проверки синтаксиса и привилегий, а также для выделения частной области SQL для этой команды.

  3. BIND_VARIABLE (связывание переменной): для каждого элемента данных, вводимого во время прогона, требуется вызов BIND_VARIABLE, чтобы поместить значение переменной в предназначенное для этого поле (place-holder).

  4. DEFINE_COLUMN (определение столбца): в случае посылки запроса необходимо указать переменные, в которые будут поступать значения полей выбранных строк (подобно предложению INTO в статическом запросе).

  5. EXECUTE: выполнение команды SQL.

  6. FETCH_ROWS: выборка строк, удовлетворяющих условиям запроса.

  7. VARIABLE_VALUE или COLUMN_VALUE: COLUMN_VALUE вызывается для определения значения столбца, полученного во время вызова FETCH_ROWS. VARIABLE_VALUE используется для выборки значений, присвоенных выходным переменным PL/SQL.

  8. CLOSE_CURSOR: если курсор больше не нужен, он закрывается, чтобы освободить память.

Пример использования. Создаём процедуру:

CREATE OR REPLACE PROCEDURE exec_procedure

(v_proc_name VARCHAR2)

IS

v_sql_statement VARCHAR2(100) = ‘BEGIN ’ ||

Соседние файлы в папке LA