- •Лабораторная работа № 11. Пакеты oracle pl/sql
 - •Цель работы
 - •2 Методические указания
 - •3 Задания к лабораторной работе № 11
 - •4. Теоретический материал Создание пакетов
 - •Правила построения пакетов
 - •Спецификация пакета
 - •Указания по разработке пакетов:
 - •Правила вызова элементов пакета
 - •Удаление пакетов
 - •Перегрузка пакетов
 - •Порядок разрешения вызова
 - •Предварительное объявление
 - •Одноразовые процедуры
 - •Побочные эффекты
 - •Ограничение функции в правах обращения
 - •Курсорные переменные и пакеты
 
Одноразовые процедуры
Такая процедура не имеет имени и выполняется только один раз, когда пакет впервые вызывается во время пользовательского сеанса.
Примечание: автоматическую одноразовую процедуру можно использовать для инициализации общедоступных или частных переменных, если вычисления слишком сложны, чтобы включать их в объявление переменной. Но в этом случае не инициализируйте переменную при объявлении, т.к. это значение будет сброшено одноразовой процедурой.
Пример.
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;
