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

Указания по разработке пакетов:

  • Делайте пакеты как можно более универсальными, чтобы использовать их других приложениях. Не создавайте пакеты, дублирующие то, что уже сделано стандартными средствами 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;