- •Создание пакетов
- •3 Procedure reset_comm
- •4 (V_comm in number);
- •5 End comm_package;
- •2 Function validate_comm
- •V_mgr in emp.Mgr%type,
- •V_empno number;
- •Index by binary integer;
- •2 Emp_table emp_package.Emp_table type;
- •Index by binary_integer;
- •Into g_comm
- •Interest real; -- общая переменная
- •Interest number
- •Into interest --процедуры
- •V_message varchar2(50);
- •V_proc_name || ‘ end;’;
- •V_cursor integer;
- •V_return integer;
- •V_ename emp.Ename%type;
- •V_sal emp.Sal%type;
- •V_column_value varchar(30) ;
- •Var v_out1 varchar2(10);
- •Var v_out2 number;
- •Контрольные вопросы.
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.
OPEN_CURSOR: для обработки команды SQL необходимо открыть курсор и получить логический дескриптор (handle), используемый в качестве идентификационного номера курсора.
PARSE (синтаксический анализ): каждая SQL-команда должна быть подвергнута синтаксическому разбору (анализу) для проверки синтаксиса и привилегий, а также для выделения частной области SQL для этой команды.
BIND_VARIABLE (связывание переменной): для каждого элемента данных, вводимого во время прогона, требуется вызов BIND_VARIABLE, чтобы поместить значение переменной в предназначенное для этого поле (place-holder).
DEFINE_COLUMN (определение столбца): в случае посылки запроса необходимо указать переменные, в которые будут поступать значения полей выбранных строк (подобно предложению INTO в статическом запросе).
EXECUTE: выполнение команды SQL.
FETCH_ROWS: выборка строк, удовлетворяющих условиям запроса.
VARIABLE_VALUE или COLUMN_VALUE: COLUMN_VALUE вызывается для определения значения столбца, полученного во время вызова FETCH_ROWS. VARIABLE_VALUE используется для выборки значений, присвоенных выходным переменным PL/SQL.
CLOSE_CURSOR: если курсор больше не нужен, он закрывается, чтобы освободить память.
Пример использования. Создаём процедуру:
CREATE OR REPLACE PROCEDURE exec_procedure
(v_proc_name VARCHAR2)
IS
v_sql_statement VARCHAR2(100) = ‘BEGIN ’ ||