- •Создание пакетов
- •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;
- •Контрольные вопросы.
Interest real; -- общая переменная
. . .
FUNCTION compound (years IN NUMBER,
amount IN NUMBER,
rate IN NUMBER)
RETURN NUMBER;
. . .
PRAGMA RESTRICT_REFERENCES(compound,WNDS,RNPS,WNPS);
END finance;
-- Тело пакета
CREATE OR REPLACE PACKAGE BODY finance AS
FUNCTION compound (years IN NUMBER,
amount IN NUMBER,
rate IN NUMBER) RETURN NUMBER
IS
BEGIN
RETURN (amount * POWER ((rate/100)+1, years));
END compound;
END finance;
Вызов функции COMPOUND, входящей в пакет FINANCE, из команды SELECT в блоке PL/SQL. Функция COMPOUND находится в удаленной базе данных в Нью-Йорке.
DECLARE
Interest number
BEGIN
. . .
SELECT finance.compound@ny(yrs,amt,rte) -- вызов
Into interest --процедуры
FROM accounts
WHERE acctno = acct id;
. . .
END;
Курсорные переменные и пакеты.
Курсорная переменная обычно создается в два этапа. Сначала необходимо определить тип REF CURSOR, а затем объявить курсорную переменную этого типа. Определить тип REF CURSOR можно в любом блоке PL/SQL, подпрограмме или пакете. Но объявить курсорную переменную в пакете нельзя. В отличие от пакетной переменной курсорная переменная не имеет устойчивого состояния. (Курсорная переменная создает указатель на элемент вместо самого элемента).
CREATE OR REPLACE PACKAGE emp_data AS -- спецификация
. . .
TYPE emp_cur_typ IS REF CURSOR RETURN emp%ROWTYPE;
-- определение типа
PROCEDURE use_emp_cv(emp_cv IN OUT emp_cur_typ);
END emp_data;
-- --------------- Тело пакета ------
CREATE OR REPLACE PACKAGE BODY emp_data AS
. . .
PROCEDURE use_emp_cv(emp_cv IN OUT emp_cur_typ)
IS
BEGIN
OPEN emp_cv FOR SELECT * FROM emp;
END use_emp_cv;
END emp_data;
В этом примере открывается курсорная переменная путем передачи ее в пакетную процедуру, которая объявляет курсорную переменную как один из своих формальных параметров. Следует отметить, что формальный параметр имеет тип IN OUT, т.к. это позволяет подпрограмме передать открытый курсор обратно в вызывающую программу.
Другой способ - использовать автономную процедуру. В этом случае тип REF CURSOR должен быть определён в отдельном пакете, а затем нужно обратиться к этому типу в автономной процедуре и открыть курсорную переменную.
Пакеты, поставляемые корпорацией Oracle
Сервер Oracleпоставляется с процедурной опцией (ProcedureOption), позволяющей использовать некоторые средства языка SQL в PL/SQL или увеличить функциональные возможности базы данных.
Использование пакетов, поставляемых корпорацией Oracle. Как правило, они имеют именаDBMS_ИмяПакета
Пакет |
Описание |
DBMS_ALERT |
Уведомляет о событиях в базе данных. |
DBMS_ APPLICATION_INFO |
Позволяет инструментарию для создания приложений и разработчикам приложений информировать базу данных о высоком уровне своей активности в данный момент. |
DBMS_DDL |
Перекомпилирует процедуры, функции и пакеты; анализирует индексы, таблицы и кластеры. |
DBMS_DESCRIBE |
Возвращает описание аргументов для данной хранимой процедуры. |
DBMS_JOB |
Планирует периодическое выполнение кода PL/SQL |
DBMS_LOCK |
Запрашивает, преобразует и освобождает пользовательские блокировки, управление которыми осуществляют службы блокировок РСУБД. |
DBMS_MAIL |
Посылает сообщения из сервера Oracleпрямо вOracle*Mail. |
DBMS_OUTPUT |
Осуществляет вывод сообщений из триггеров, хранимых процедур и функций. |
DBMS_PIPE |
Посылает сообщения из одного сеанса в другой в одном и том же экземпляре базы данных. |
DBMS_SESSION |
Обеспечивает доступ к SQL-командам, меняющим параметры сеанса, и прочей информации о сеансе. |
DBMS_ SHARED_POOL |
Блокирует объекты в совместно используемой памяти, препятствуя их откачке механизмом LRU. |
DBMS_SQL |
Использует динамический SQL для доступа к базе данных. |
DBMS_ TRANSACTION |
Управляет логическими транзакциями и повышает производительность коротких нераспределенных транзакций, создавая их как дискретные. |
DBMS_UTILITY |
Анализирует объекты в конкретной схеме, проверяет, работает ли сервер в данный момент в параллельном режиме, и возвращает время. |
UTL_FILE |
Добавляет в PL/SQL средства ввода/вывода. |
Пакет DBMS_PIPE.
Пакет DBMS_PIPE(pipe– труба) выполняет следующие функции:
Позволяет двум или более сеансам, подключенным к одному и тому же экземпляру базы данных, обмениваться сообщениями с помощью программного канала (подобно программным каналам в UNIX).
Каждый программный канал работает асинхронно.
В зависимости от того, какая степень безопасности вам требуется, вы можете пользоваться общедоступным или частным программным каналом.
Информация, считанная из буфера пользователем, уничтожается. Другим пользователям, считывающим тот же самый канал, она недоступна.
Прежде, чем послать сообщение, необходимо его создать. Для этого сначала требуется один или несколько вызовов процедуры PACK_MESSAGE, а затем вызывается процедура SEND_MESSAGE, помещающая сообщение из локального буфера в указанный программный канал.
Для получения сообщения из программного канала необходимо сначала вызвать процедуру RECEIVE_MESSAGE, а затем -UNPACK_MESSAGE для доступа к отдельным элементам сообщения.
Примечание. Буферы программных каналовOracleнаходятся в SGA. Это значит, что при закрытии экземпляра информация в них теряется.
-
Pack_message
Send_mesage
Сеанс 1
Receive_message
Unpack_mesage
Сеанс 2
Канал имеет имя
Функциональная схема работы канала
Пример процедуры, которая при вызове помещает информацию в программный канал (здесь его имя DEMO_PIPE).
CREATE OR REPLACE PROCEDURE
send_message(v_message VARCHAR2) IS
s INTEGER;
BEGIN
DBMS_PIPE.PACK_MESSAGE(v_message);
s := DBMS_PIPE.SEND_MESSAGE(‘DEMO_PIPE’);
IF s <> 0 THEN
RAISE_APPLICATION_ERROR(-20200, ‘Error: ’ ||
TO_CHAR(s) || ‘sending pipe’);
END IF;
END send_message;
А эта процедура может использоваться для вывода информации.
CREATE OR REPLACE PROCEDURE receive_message
IS
s INTEGER,