Говорить о вызове или выполнении пакета PL/SQL в целом не имеет смысла, поскольку пакет является всего лишь контейнером для элементов кода. В программе можно использовать только элементы пакета.
Для ссылки на элементы пакета извне используется такой же точечный синтаксис, как для ссылки на столбцы таблиц. Давайте рассмотрим несколько примеров.
В следующей спецификации пакета объявляются константа, исключение, курсор PL/SQL и несколько модулей:
PACKAGE pets_inc
IS
max_pets_in_facility CONSTANT INTEGER := 120;
pet_is_sick EXCEPTION;
CURSOR pet_cur (pet_id_in IN pet.id%TYPE) RETURN pet%ROWTYPE;
FUNCTION next_pet_shots (pet_id_in IN pet.id%TYPE) RETURN DATE;
PROCEDURE set_schedule (pet_id_in IN pet.id%TYPE);
END pets_inc;
Для ссылки на любые из этих элементов перед именем элемента ставится префикс в виде имени пакета:
DECLARE
-- Константа объявляется на основе типа столбца id таблицы pet
c_pet CONSTANT pet.id%TYPE:= 1099;
v_next_appointment DATE;
BEGIN
IF pets_inc.max_pets_in_facility > 100
THEN
OPEN pets_inc.pet_cur (c_pet);
ELSE
v_next_appointment:= pets_inc.next_pet_shots (c_pet);
END IF;
EXCEPTION
WHEN pets_inc.pet_is_sick
THEN
pets_inc.set_schedule (c_pet);
END;
Итак, при обращении к элементам пакета PL/SQL необходимо соблюдать два правила:
- Если элемент определяется в спецификации пакета, то для ссылки на него из внешней программы следует использовать точечный синтаксис: имяпакета.имяэлемента.
- Если ссылка на элемент используется в самом пакете (спецификации или теле), имя пакета задавать не нужно, поскольку
PL/SQL
автоматически идентифицирует ее как обращение к элементу, объявленному в области действия пакета.