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

Удаление пакетов

Полное удаление пакета (и спецификации и тела):

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;

Правила предварительного объявления:

  • Список формальных параметров должен присутствовать как в предварительном объявлении, так и в теле подпрограммы.

  • Тело подпрограммы может появиться в любом месте после предварительного объявления, но они должны быть в пределах одной и той же программной единицы.

Предварительное объявление обычно используется в следующих целях:

  • Для определения программ в алфавитном или логическом порядке

  • Для определения взаимно рекурсивных подпрограмм

  • Для объединения подпрограмм в пакет

Обычно предварительные объявления позволяют объединять взаимосвязанные программы в пакеты. Спецификации программ становятся частью спецификации пакета, а тела программ - частью тела пакета, где они невидимы для приложений. Таким образом, пакеты помогают скрыть детали реализации.