UPDATE BOOKS_DELIVERY SET
QUANTITY = QUANTITY + ADD_BOOKS.QUANTITY
WHERE BOOKS_DELIVERY.CODE_BOOK
= ADD_BOOKS.CODE_BOOK
AND
BOOKS_DELIVERY.SALESMAN = ADD_BOOKS.SALESMAN;
ELSE
INSERT INTO BOOKS_DELIVERY
VALUES
(CODE_OP.NEXTVAL,
ADD_BOOKS.CODE_BOOK, ADD_BOOKS.SALESMAN,
ADD_BOOKS.QUANTITY, SYSDATE);
END IF;
END ADD_BOOKS;
FUNCTION TEST_B (SALESMAN VARCHAR2)
RETURN BOOLEAN IS
MIN_QUANTITY NUMBER(5) :=10;
MAX_QUANTITY NUMBER(5) := 100;
Q NUMBER(5);
BEGIN
SELECT SUM(QUANTITY) INTO Q FROM
BOOKS_DELIVERY WHERE
BOOKS_DELIVERY.SALESMAN = TEST_B.SALESMAN;
RETURN (Q >= MIN_QUANTITY AND Q <= MAX_QUANTITY);
END TEST_B;
END BOOKS_DELIV;
При создании спецификации или тела пакета с помощью SQL*PLUS,
необходимо указывать в строке, следующей за последним оператором,
косую черту (/), чтобы оператор CREATE … PACKAGE выполнился.
Процедуры и функции модуля внутри модуля могут быть перегружен-
ными. Это означает, что может существовать несколько процедур и
функций с одним и тем же именем, но разными списками параметров.
Это очень удобно, так как позволяет выполнять одну и ту же операцию
над объектами различных типов. В этом случае все различные варианты
процедур или
функций описываются в заголовке пакета, а в его теле раз-
мещаются тексты этих подпрограмм.
Следует иметь в виду, что пакет допускает наличие перегруженных
функций и процедур при выполнении ряда ограничений.
1. Нельзя перегружать две подпрограммы, если их параметры отли-
чаются именами. Например, при наличии функции – FUNCTION AA(A1
180
IN NUMBER) нельзя объявить еще одну функцию – FUNCTION AA(K1
IN NUMBER).
2. Нельзя перегружать две подпрограммы, если их параметры отли-
чаются видами. Например, при наличии функции – FUNCTION AA(A1
IN NUMBER) нельзя объявить еще одну функцию – FUNCTION AA(A1
OUT NUMBER).
3. Запрещается перегружать функции, если типы параметров относят-
ся к одному семейству типов данных. Например, типы CHAR и VAR-
CHAR2 входят в одно и то же семейство.
4. Нельзя перегружать функции, если они отличаются лишь типом
возвращаемых данных.
Любой объект, объявленный в заголовке пакета, находится в области
действия, и видим вне границ этого пакета. Для обращения к такому объ-
екту необходимо перед именем объекта указать имя пакета, отделив его
от имени объекта точкой (имя_пакета.имя_процедуры или имя_паке-
та.имя_функции). Например, процедуру INCREASE можно вызвать из
анонимного блока PL/SQL следующим образом:
BEGIN
BOOKS_DELIV.INCREASE(1);
END;
Приведем пример вызова функции TEST_B.
DECLARE
ADD_SALESMAN VARCHAR2(20);
ADD_QUANTITY NUMBER(5);
ADD_CODE_BOOK NUMBER(5);
BEGIN
ADD_SALESMAN := 'Иванов И. И.';
ADD_QUANTITY := 20;
ADD_CODE_BOOK := 3;
IF BOOKS_DELIV.TEST_B (ADD_SALESMAN) THEN
UPDATE BOOKS_DELIVERY
SET
QUANTITY = QUANTITY + ADD_QUANTITY
WHERE
BOOKS_DELIVERY.CODE_BOOK = ADD_CODE_BOOK
AND BOOKS_DELIVERY.SALESMAN =
ADD_SALESMAN;
END IF;
END;
181
При этом вызов процедуры аналогичен вызову обычной хранимой
процедуры. При вызове функций и процедур пакета список параметров
подчиняется тем же условиям, что и список параметров обычных функ-
ций и процедур. Для модульных подпрограмм могут задаваться парамет-
ры по умолчанию, и вызывать такие подпрограммы можно при помощи
как позиционного, так и именованного представления. Если процедура
модуля использует объявления, заданные в заголовке, то эти объявления
можно использовать как с уточняющими именами, так и без них.
Достарыңызбен бөлісу: