- •Лабораторная работа № 11. Пакеты oracle pl/sql
- •Цель работы
- •2 Методические указания
- •3 Задания к лабораторной работе № 11
- •4. Теоретический материал Создание пакетов
- •Правила построения пакетов
- •Спецификация пакета
- •Указания по разработке пакетов:
- •Правила вызова элементов пакета
- •Удаление пакетов
- •Перегрузка пакетов
- •Порядок разрешения вызова
- •Предварительное объявление
- •Одноразовые процедуры
- •Побочные эффекты
- •Ограничение функции в правах обращения
- •Курсорные переменные и пакеты
Удаление пакетов
Полное удаление пакета (и спецификации и тела):
DROP PACKAGE имя_пакета;
Удаление только тела пакета:
DROP PACKAGE BODY имя_пакета;
Перегрузка пакетов
Позволяет использовать одно и то же имя для разных подпрограмм в пакете
Формальные параметры подпрограмм должны отличаться по количеству, порядку и семейству типов данных.
Перегружаемые подпрограммы могут помещаться в локальные подпрограммы и подпрограммы, входящие в пакеты.
Ограничения на перегрузку программ и функций:
Перегружать можно только локальные или пакетные программы.
Перегрузка двух программ невозможна, если их формальные параметры отличаются только именами или режимом параметров.
Перегрузка двух программ невозможна, если их формальные параметры отличаются только типами данных и эти различные типы принадлежат одному и тому же семейству типов данных.
Перегрузка двух программ невозможна, если их формальные параметры отличаются только подтипом данных и эти разные подтипы основаны на типах данных одного и того же семейства.
Перегрузка двух функций невозможна, если они отличаются только типом возвращаемых данных, даже если эти типы относятся к разным семействам.
Порядок разрешения вызова
Компилятор, прежде всего, пытается найти декларативную информацию, соответствующую данному вызову (т.е. объявление соответствующей программы). Сначала компилятор ищет эту информацию в локальной области видимости, а затем, если требуется, во внешних областях видимости. Поиск прекращается, когда компилятор находит одно или несколько объявлений программ, имя в которых совпадает с именем вызываемой программы. Если программы на одном и том же уровне видимости имеют одинаковые имена, компилятору требуется точное совпадение по количеству, порядку и типам данных между фактическими и формальными параметрами.
Пример перегружаемой программы.
Описание:
PROCEDURE initialize(tab OUT datetabtyp, n INTEGER) IS
BEGIN
FOR i in 1..n LOOP
tab(i) := SYSDATE;
END LOOP;
END initialize;
-- -- -- -- -- --
PROCEDURE initialize(tab OUT realtabtyp, n INTEGER) IS
BEGIN
FOR i in 1..n LOOP
tab(i) := 1000;
END LOOP;
END initialize;
Вызов перегружаемых вариантов программы:
DECLARE
TYPE datetabtyp IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
TYPE realtabtyp IS TABLE OF REAL
INDEX BY BINARY_INTEGER;
hiredate_tab datetabtyp;
sal_tab realtabtyp ;
indx ВINARY_INTEGER;
BEGIN
indx := 50;
initialize(hiredate_tab,indx); --вызов 1-го варианта
initialize(sal_tab,indx); --вызов 2-го варианта
. . .
END;
Предварительное объявление
В PL/SQL, программа (как и любой идентификатор) должна быть описана до того, как на неё сошлются. Но если программы вызывают друг друга (взаимная рекурсия), то перестановки описаний недостаточно – требуется предварительное объявление (forward declaration).
Предварительное объявление состоит из заголовка программы, располагающегося до ключевого слова IS (или AS) и заканчивающегося точкой с запятой.
Пример:
. . .
PROCEDURE calc_rating(...); -- предварительное
-- объявление
. . .
PROCEDURE award_bonus(...)IS -- объявление подпрограмм
BEGIN -- в алфавитном порядке
calc_rating(. . .);
. . .
END;
PROCEDURE calc_rating(. . .) IS
BEGIN
award_bonus(. . .);
. . .
END;
Правила предварительного объявления:
Список формальных параметров должен присутствовать как в предварительном объявлении, так и в теле подпрограммы.
Тело подпрограммы может появиться в любом месте после предварительного объявления, но они должны быть в пределах одной и той же программной единицы.
Предварительное объявление обычно используется в следующих целях:
Для определения программ в алфавитном или логическом порядке
Для определения взаимно рекурсивных подпрограмм
Для объединения подпрограмм в пакет
Обычно предварительные объявления позволяют объединять взаимосвязанные программы в пакеты. Спецификации программ становятся частью спецификации пакета, а тела программ - частью тела пакета, где они невидимы для приложений. Таким образом, пакеты помогают скрыть детали реализации.
