Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ к лабораторным работам №11 Пакеты.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
131.35 Кб
Скачать

Одноразовые процедуры

Такая процедура не имеет имени и выполняется только один раз, когда пакет впервые вызывается во время пользовательского сеанса.

Примечание: автоматическую одноразовую процедуру можно исполь­зовать для инициализации общедоступных или частных переменных, если вычисления слишком сложны, чтобы включать их в объявление переменной. Но в этом случае не инициализируйте переменную при объявлении, т.к. это значение будет сброшено одноразовой процедурой.

Пример.

CREATE OR REPLACE PACKAGE BODY comm_package IS

FUNCTION validate_comm

. . .

END validate_comm;

. . .

END reset_comm;

-- Автоматическая одноразовая процедура

-- (устанавливает глобальную переменную g_comm)

BEGIN

SELECT AVG(COMMISSION_PCT)

INTO g_comm

FROM EMPLOYEES;

END comm_package;

Побочные эффекты

Чтобы сервер Oracle мог выполнить SQL команду, которая вызывает хранимую функцию, он должен знать, что функция не имеет побочных эффектов. Побочные эффекты - это изменения в таблицах базы данных или общедоступных пакетных переменных (объявленных в спецификации пакета). Побочные эффекты могут замедлить выполнение запроса, привести к появлению результатов, зависимых от последовательности выполнения подпрограмм (и, следовательно, промежуточных), а также потребовать того, чтобы переменные, в которых хранится состояние пакета, сохранялись от сеанса к сеансу (что недопустимо). Поэтому к хранимым функциям, вызываемым из SQL-выражений, применяются следующие ограничения:

  • Функция не может модифицировать таблицы базы; следовательно, она не может выполнять операции INSERT, UPDATE и DELETE.

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

  • Изменять значения пакетных переменных могут только функции, вызываемые из предложения SELECT, VALUES или SET.

  • Функция не может вызывать никакую другую подпрограмму, нарушающую одно из вышеуказанных правил. Кроме того, функция не может обращаться к представлению, нарушающему какое-либо из этих правил.

Ограничение функции в правах обращения

Такое ограничение задаётся директивой компилятора:

PRAGMA RESTRICT_REFERENCES (имя_функции | DEFAULT,

список_ограничений );

Указание DEFAULT говорит о том, что ограничения относятся ко всем функциям пакета.

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

WNDS - Сокращение от "Writes No Database State", т.е. функция не может изменять таблицы базы данных.

RNDS - Сокращение от "Read No Database State", т.е. функция не может запрашивать таблицы базы данных.

WNPS - Сокращение от "Writes No Package State", т.е. функция не может изменять значения пакетных переменных.

RNPS - Сокращение от "Read No Package State", т.е. функция не может обращаться к общедоступным пакетным переменным.

TRUST – (доверять), указанные для пакета ограничения не вступают в силу для данной функции и компилятору приходится «верить», что побочные эффекты функции – правильные.

  • Попытка скомпилировать тело функции, нарушающее указание, директивы PRAGMA приведет к ошибке компиляции.

  • В случае автономных функций сервер Oracle может обеспечить соблюдение этого ограничения путем проверки тела функции. Но тело пакетной функции скрыто; видима только спецификация. Следовательно, для пакетных функций использование директивы PRAGMA обязательно.

  • Если пакет включает несколько одноименных функций, указание компилятору в директиве PRAGMA относится к последней функции.

Пример: Создаём функцию COMPOUND в пакете FINANCE. Функция будет вызываться из SQL-команд в удаленных базах данных. Поскольку удаленные функции не могут ни читать, ни изменять значения пакетных переменных. Они также не должны изменять таблицы базы данных, т.к. вызываются из SQL-команды. Следовательно, необходимо указать ограничения RNPS, WNPS и WNDS.

CREATE OR REPLACE PACKAGE finance -- спецификация

AS -- пакета

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;