- •ВВЕДЕНИЕ
- •1. ВВЕДЕНИЕ В PL/SQL
- •1.1. ОПИСАНИЕ PL/SQL
- •1.2. ПРЕИМУЩЕСТВА PL/SQL
- •2. КОМАНДЫ DATA DEFINITION LANGUAGE (DDL)
- •2.1. ОСНОВНЫЕ ОБЪЕКТЫ ORACLE
- •2.2. ТАБЛИЦЫ
- •2.5. ИЗМЕНЕНИЯ ОБЬЕКТОВ
- •2.3. ПРЕДСТАВЛЕНИЕ (VIEW)
- •2.4. ИНДЕКС
- •КОНТРОЛЬНЫЕ ВОПРОСЫ К ГЛАВЕ 2
- •3. ЯЗЫК ORACLE SQL
- •3.3. ВЫБОРКА
- •3.4. ОБРАБОТКА ОШИБОК
- •3.5. ВЫРАЖЕНИЯ
- •КОНТРОЛЬНЫЕ ВОПРОСЫ К ГЛАВЕ 3
- •4. ЯЗЫК PL/SQL
- •4.1. ТИПЫ ДАННЫХ PL/SQL
- •4.2. СТРУКТУРА ПРОГРАММЫ НА PL/SQL
- •4.3. УПРАВЛЕНИЕ ВЫПОЛНЕНИЕМ ПРОГРАММЫ
- •4.4. УЧЕБНАЯ БАЗА ДАННЫХ
- •4.5. КУРСОРЫ
- •4.6. ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
- •4.7. СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКИХ ПРОЦЕДУР И ФУНКЦИЙ
- •4.8. ПАКЕТЫ PL/SQL
- •4.9. ТРИГГЕРЫ БАЗЫ ДАННЫХ
- •ЗАКЛЮЧЕНИЕ
- •СПИСОК ЛИТЕРАТУРЫ
10. Описать и вызвать функцию, которая вычисляет для студентов, номера которых находятся в данном диапазоне, средний балл по заданному названию предмета.
4.8. ПАКЕТЫ PL/SQL
Модуль – это конструкция PL/SQL, которая позволяет хранить связанные объекты в одном месте. Модули бывают только хранимыми и никогда локальными. Модуль – это именованный раздел объявлений. Всё, что может входит в раздел объявлений блока, может входить и в модуль: типы, переменные, процедуры, функции, курсоры. Размещение их в модуле полезно, так как это позволит ссылаться на них из других блоков PL/SQL. В модулях можно описывать и глобальные переменные для PL/SQL.
Процедуры, функции и глобальные переменные, объединенные общим функциональным замыслом, часто оформляют в виде единого объекта базы данных – пакета. Особенностью пакетов PL/SQL является раздельная компиляция и хранение интерфейсной и исполнительной частей пакета. Пакет как объект состоит из двух частей: спецификации пакета и тела пакета. В спецификации пакета хранится описание процедур, функций, глобальных переменных, констант и курсоров, которые доступны для внешних приложений. В теле пакета определяются все процедуры, функции и переменные, включая те, которые не были определены в спецификации пакета. Процедуры, функции и переменные, определённые в теле пакета, но не описанные в его спецификации, являются локальными. Внешние по отношению к пакету приложения не имеют права на использование локальных объектов пакета. Локальные объекты предназначены исключительно для использования только процедурами и функциями самого пакета.
Особенностью пакетов PL/SQL является поддержка перегружаемых функций и процедур. Процедуры или функции могут иметь одинаковое имя, но различный по типу или количеству набор аргументов. В момент обращения к конкретной процедуре или функции по числу и типу передаваемых аргументов автоматически определяется требуемая процедура или функция, которая и исполняется. Поддержка перегружаемых процедур, в частности, используется в стандартном пакете DBMS_OUTPUT для единой формы обращения к процедуре PUT_LINE для вывода данных различных типов.
Напомним, что для создания пакета пользователь должен иметь привилегию CREATE PROCEDURE. Создание пакета в схеме другого пользователя требует наличия привилегии CREATE ANY PROCEDURE.
67
Синтаксис оператора определения интерфейсной части (спецификации) пакета:
CREATE [OR REPLACE] PACKAGE [схема.]имя_пакета
{IS | AS}
спецификация_пакета_на_PL/SQL
Ключевое слово OR REPLACE указывает на безусловное замещение старого текста спецификации пакета. Если ключевое слово OR REPLACE не указано, и пакет определен в системе, то замещения старого значения спецификации пакета не происходит, и возвращается сообщение об ошибке. Спецификация пакета начинается с описания констант и переменных. При описании переменных пакета ключевое слово DECLARE не используется.
Пример 4.24.
Рассмотрим пример создания спецификации пакета, которая состоит из описания константы, функции и процедуры.
CREATE OR REPLACE PACKAGE РАС
IS
PAC_CONST CONSTANT NUMBER:=20;
FUNCTION MUL(Argl NUMBER, Arg2 NUMBER) RETURN NUMBER;
PROCEDURE AUDIT;
END;
/
Синтаксис оператора определения исполнительной части (тела) пакета:
CREATE [OR REPLACE] PACKAGE BODY [схема.]имя_пакета
{IS | AS} cneцификaция_naкema_нa_PL/SQL
Ключевое слово OR REPLACE указывает на безусловное замещение старого текста спецификации пакета. Если ключевое слово OR REPLACE не указано, и пакет определен в системе, то замещения старого значения спецификации пакета не происходит, и возвращается сообщение об ошибке.
ОПРЕДЕЛЕНИЕ ТЕЛА ПАКЕТА начинается с описания констант и переменных. Константы и переменные, описанные в спецификации пакета, являются глобальными и в теле пакета повторно не описываются. При описании констант и переменных пакета ключевое слово DECLARE не используется. При описании функций и процедур пакета, в отличие от описаний одиночных функций и процедур оператор CREATE, не используется.
Рассмотрим пример создания тела пакета, спецификация которого приведена выше. Пусть функция пакета MUL выполняет умножение аргументов на
68
константу пакета, а процедура AUDIT фиксирует факт обращения к функции MUL записью в таблицу значения счётчика обращений и текущей даты. Предполагается, что таблица TabAUD с соответствующими типами данных атрибутов к моменту создания тела пакета создана. Протокол создания тела пакета приведён ниже.
Пример 4.25.
SQL>CREATE OR REPLACE PACKAGE BODY РАС IS
PAC_COUNT NUMBER:=0;
FUNCTION MUL(Argl NUMBER, Arg2 NUMBER)
RETURN NUMBER IS
BEGIN
AUDIT;
RETURN Argl* PAC_CONST+Arg2*PAC_CONST;
END;
PROCEDURE AUDIT IS
BEGIN
РАС COUNT:=PAC_COUNT+1;
INSERT INTO TabAUD VALUES (PAC COUNT, SYSDATE);
COMMIT;
END;
END; 16 /
Package body created.
Константа или переменная, описанная в спецификации пакета, может быть доступна из пользовательской программы (если процедуре или функции такой доступ разрешен). Чтобы обратиться к глобальной переменной или константе пакета, нужно указать в качестве префикса имя пакета
Ниже приведён пример, иллюстрирующий возможность доступа к глобальной константе пакета и невозможность доступа к частной переменной пакета:
SQL>EXEC DBMSJDUTPUT.PUT LINE{РАС.PAC_CONST); 20.0 PL/SQL procedure successfully completed.
SQL>EXEC DBMS_OUTPUT.PUT_LINE(РАС.PAC_COUNT); begin
dbms_output. Put_line (рас. Pac_count) ; end;
69
ERROR at line 1;
ORA-06550: line I, column 34:
PLS-00302: component ‘PAC_COUNT’ must be declared ORA06550: line I, column 7:
PL/SQL: Statement ignored
Чтобы вызвать процедуру или функцию пакета, в вызове нужно указать в качестве префикса имя пакета. В заключение рассмотрим пример использования функции созданного пакета:
SQL>EXEC DBMS_OUTPUT.PUT_LINE(PAC.MUL(111,222)) ;
PL/SQL procedure successfully completed.
При использовании переменных пакета инициализация локальных переменных пакета происходит при запуске сервера Oracle. В данном случае, после останова и повторного запуска сервера, счётчик обращений PAC_COUNT будет установлен в нулевое состояние. Если по смыслу решаемой задачи требуется независимое от остановов сервера приращение счётчика, можно воспользоваться таким объектом, как последовательность.
Для освобождения ресурсов сервера может потребоваться уничтожить пакет. В собственной схеме пользователю не требуются дополнительные привилегии для уничтожения пакета. Для уничтожения пакета в схеме другого пользователя необходима привилегия DROP ANY PROCEDURE.
Cинтаксис:
DROP PACKAGE [BODY] [схема.]имя пакета
Необязательное ключевое слово BODY указывает, что уничтожается только тело пакета. Если ключевое слово BODY опущено, то удаляется и спецификация, и тело пакета. Параметр имя_пакета задаёт имя уничтожаемого пакета
SQL > DROP PACKAGE РАС;
Package dropped
УПРАЖНЕНИЯ
1. Создать пакет, состоящий из функции с параметрами, процедуры без параметров. Функция подсчитывает количество студентов, получающих стипендию, заданную параметром. Процедура подсчитывает число обращений к функции и заносит это число, размер стипендии, количество студентов, получающих ее, в новую таблицу, созданную заранее.
70
