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

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,

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