Вызов функции
Функция вызывается точно так же, как любая встроенная функция базы
данных (см. главу 4). (Напомню, что вызов функции осуществляется при
помощи оператора SELECT с использованием таблицы dual во фразе FROM.)
В следующем примере вызывается функция circle_area(), которой с использованием
позиционной записи передается значение радиуса, равное
2 метрам:
□ SELECT circle_area(2)
FROM dual;
380 Глава 11
CIRCLE_AREA(2)
12 .5 66 370 4
В базе данных Oracle l l g вы также можете использовать поимённую и
смешанную записи при вызове функций. Например, следующий запрос использует
поимённую запись при вызове circle_area():
□ SELECT circle_area(p_radius => 4)
FROM dual;
CIRCLE_AREA(P_RADIUS=>4)
5 0.2 65 48 1 6
В следующем примере вызывается average_product_price(); в нее передается
значение параметра, равное 1 , для вычисления средней цены товара,
для которого p r o d u c t _ t y p e _ id = 1:
□ SELECT average_product_price(1)
FROM dual;
AVERAGE_PRODUCT_PRICE(1)
2 9 .9 6 5
Получение информации о функциях
Получить информацию о функциях можно из представления user_
procedures (см. выше). В следующем примере из user_procedures отбираются
столбцы object_name, aggregate и parallel для circle_area() и average_
product_price():
□ SELECT object_name, aggregate, parallel
FROM user_procedures
WHERE object_name IN (‘CIRCLE_AREA', 'AVERAGE_PRODUCT_PRICE’);
0BJECT_NAME AGG PAR
AVERAGE_PRODUCT_PRICE NO N0
CIRCLE_AREA N0 N0
Удаление функции
Для удаления функции используется оператор DROP FUNCTION. Следующий
оператор удаляет функцию circle_area():
□ DROP FUNCTION c i r c l e _ a r e a ( );
Пакеты
В этом разделе показано, как группировать процедуры и функции в пакеты.
Пакеты позволяют инкапсулировать связанные функциональности в
один автономный модуль. Путем подобной модуляризации кода PL/SQL
Знакомство с программированием на PL/SQL 381
можно строить собственные библиотеки программ, которые затем могут
быть использованы другими программистами. На самом деле база данных
Oracle поставляется вместе с библиотекой пакетов, которые позволяют
вам получать доступ ко внешним файлам, управлять базой данных, генерировать
HTML и многое другое. Чтобы увидеть весь список пакетов, вам
следует обратиться к учебнику Oracle Database PL/SQL Packages and Types
Reference корпорации Oracle.
Обычно пакеты состоят из двух компонентов: спецификации и тела.
Спецификация пакета перечисляет все имеющиеся в пакете процедуры,
функции, типы и объекты. Вы можете сделать их доступными всем пользователям,
и тогда о них можно говорить как об общедоступных (хотя на самом
деле ими могут пользоваться только те пользователи, у которых есть
доступ к вашему пакету). Обычно спецификация не содержит кода, образующего
входящие в пакет процедуры или функции; код содержится в теле
пакета.
Любая процедура или функция, содержащаяся в теле пакета (и не упомянутая
в спецификации), будет доступна только внутри тела пакета: они
являются частными. Используя комбинацию общедоступных и частных
процедур и функций, можно строить пакеты, вся сложность которых оказывается
скрытой для внешнего мира. Это является одной из основных
целей всего программирования: скрыть сложность от ваших пользователей.
Создание спецификации пакета
Для создания спецификации пакета используется оператор CREATE PACKAGE.
В упрощенном виде его синтаксис выглядит следующим образом:
□ CREATE [OR REPLACE] PACKAGE имя_пакета
{IS | AS}
спецификация_пакета
END имя_пакета;
где
■ имя_пакета определяет имя пакета;
■ спецификация_лакета определяет список доступных пользователям пакета
процедур, функций, типов и объектов.
В следующем примере создается спецификация пакета product_
package:
□ CREATE PACKAGE p r o d u c t_ p a c k a g e AS
TYPE t _ r e f _ c u r s o r IS REF CURSOR;
FUNCTION g e t _ p r o d u c t s _ r e f _ c u r s o r RETURN t _ r e f _ c u r s o r ;
PROCEDURE u p d a t e _ p r o d u c t _ p r i c e (
p _ p r o d u c t _ id IN p ro d u c t s .p ro d u c t_ id% T Y P E ,
p _ f a c t o r IN NUMBER
);
END p ro d u c t_ p a c k a g e ;
/
382 Глава 11
Тип t_ref_cursor использует тип PL/SQL REF CURSOR. Тип REF CURSOR похож
на указатель в языке программирования C++ и указывает на курсор;
как вы уже видели ранее, курсор позволяет читать строки, возвращаемые
запросом. Функция get_products_ref_cursor() возвращает t _ r e f _ c u r s o r , и,
как вы увидите в следующем разделе, он указывает на курсор, который содержит
строки, полученные из таблицы products.
Процедура u p d a t e _ p r o d u c t _ p r i c e ( ) умножает цену продукта и сохраняет
изменение.
Создание тела пакета
Для создания тела пакета используется оператор CREATE PACKAGE BODY.