- •Лабораторная работа № 11. Пакеты oracle pl/sql
- •Цель работы
- •2 Методические указания
- •3 Задания к лабораторной работе № 11
- •4. Теоретический материал Создание пакетов
- •Правила построения пакетов
- •Спецификация пакета
- •Указания по разработке пакетов:
- •Правила вызова элементов пакета
- •Удаление пакетов
- •Перегрузка пакетов
- •Порядок разрешения вызова
- •Предварительное объявление
- •Одноразовые процедуры
- •Побочные эффекты
- •Ограничение функции в правах обращения
- •Курсорные переменные и пакеты
Указания по разработке пакетов:
Делайте пакеты как можно более универсальными, чтобы использовать их других приложениях. Не создавайте пакеты, дублирующие то, что уже сделано стандартными средствами Oracle.
Спецификации пакетов отражают структуру вашего приложения, поэтому определяйте их прежде, чем создавать тело каждого пакета.
Спецификация пакета должна содержать только те конструкции, которые должны быть видимы для пользователей пакета. Таким образом, другие разработчики не смогут неправильно использовать пакет, основывая свой код на несущественных деталях.
Для уменьшения объема перекомпиляции в случае изменения кода включайте в спецификацию пакета как можно меньше конструкций. Изменение в теле пакета не требуют перекомпиляции зависимых конструкций. Напротив, изменения в спецификации пакета требуют перекомпиляции каждой хранимой подпрограммы, которая обращается к пакету.
Данные объявленные в спецификации, либо объявленные в теле пакета, но вне процедур и функций пакета являются данными пакета. Область видимости этих данных охватывает весь сеанс и перекрывает границы транзакций, т.е. данные пакета являются глобальными для программ пользователя. Т.о. надо иметь в виду следующее:
Инструкции COMMIT и ROOLBACK не изменяют состояние переменных пакета.
Курсор объявленный в пакете имеет глобальную область видимости и остаётся открытым до окончания сеанса, если вы не закроете его явно, либо с использованием директивы SERIALLY_REUSABLE (описанной позже).
Примечание. Рекомендуется (в соответствии с объектно-ориентированным подходом), скрывать важные структуры данных в теле пакета, а пользователю предоставлять только методы (процедуры) работы с данными.
Пример 4: Рассмотрим реализацию тела пакета emps_pkg (см. пример 2 выше):
CREATE OR REPLACE PACKAGE emps_pkg
AUTHID CURRENT_USER
IS
min_salary CONSTANT PLS_INTEGER := 10000;
-- Объявление типа вложенной таблицы
TYPE codes_nt IS TABLE OF INTEGER;
-- Вложенная таблица объявляется на основе этого типа.
emp_int codes_nt;
TYPE emp_info_rct IS
REF CURSOR
RETURN employees%ROWTYPE;
PROCEDURE show_emps (list_in IN codes_nt);
FUNCTION most_salary RETURN emp_info_rct;
END emps_pkg;
CREATE OR REPLACE PACKAGE BODY emps_pkg
IS
-- Приватная переменная
g_min_salary PLS_INTEGER := min_salary;
-- Реализация процедуры
PROCEDURE show_emps ( list_in IN codes_nt) IS
BEGIN
FOR indx IN list_in.FIRST .. list_in.LAST
LOOP
DBMS_OUTPUT.put_line (list_in (indx));
END LOOP;
END show_emps;
-- Реализация функции
FUNCTION most_salary RETURN emp_info_rct
IS
retval emp_info_rct;
null_cv emp_info_rct;
BEGIN
OPEN retval FOR
SELECT *
FROM EMPLOYEES
WHERE SALARY > g_min_salary;
RETURN retval;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN null_cv;
END most_salary;
END emps_pkg;
