Выбрать главу

Вызов функции

Функция вызывается точно так же, как любая встроенная функция базы

данных (см. главу 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.