Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Управление данными. Использование технологий ORACLE для реализации баз данных. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
722 Кб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]