Учебное пособие Для студентов университетов Специальностей «Информатика», «Прикладная математика»



Pdf көрінісі
бет159/177
Дата15.02.2022
өлшемі2,58 Mb.
#25567
түріУчебное пособие
1   ...   155   156   157   158   159   160   161   162   ...   177

частью  и  при  отсутствии  в  заголовке  объявлений  процедур  и  функций, 
тело может отсутствовать. В этом случае в заголовке пакета можно объя-
вить  переменные,  типы,  курсоры  и  исключительные  ситуации,  которые 
будут  рассматриваться  как  глобальные  переменные  и  могут  не  объяв-
ляться в использующих их других процедурах и функциях.  
Создадим  тело  пакета BOOKS_DELIV, поместив  в  него  определения 
двух процедур и функции из раздела 13.7. 
CREATE  OR  REPLACE PACKAGE  BODY BOOKS_DELIV IS  
PROCEDURE  INCREASE  
(CODE_BOOK  NUMBER)  AS  
BEGIN 
     UPDATE  BOOKS  SET  PRICE = PRICE*1.1 
          WHERE  BOOKS.CODE_BOOK = INCREASE.CODE_BOOK; 
          IF  SQL%NOTFOUND  THEN 
                     RAISE_APPLICATION_ERROR(-20105, ‘В таблице BOOKS  
                            отсутствует книга с указанным кодом’); 
          END  IF
END  INCREASE; 
PROCEDURE  ADD_BOOKS  (CODE_BOOK  NUMBER, QUANTITY  
NUMBER,  SALESMAN  VARCHAR2)  IS 
     Q  NUMBER(5) := 0; 
 BEGIN 
     SELECT  COUNT(*)  INTO  Q  FROM  BOOKS_DELIVERY 
     WHERE  
     BOOKS_DELIVERY.CODE_BOOK = ADD_BOOKS.CODE_BOOK 
     AND   
     BOOKS_DELIVERY.SALESMAN = ADD_BOOKS.SALESMAN; 
     IF  Q <> 0  THEN 
 
179


 
       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


 
При  этом  вызов  процедуры  аналогичен  вызову  обычной  хранимой 
процедуры.  При  вызове  функций  и  процедур  пакета  список  параметров 
подчиняется тем же условиям, что и список параметров обычных функ-
ций и процедур. Для модульных подпрограмм могут задаваться парамет-
ры по умолчанию, и вызывать такие подпрограммы можно при помощи 
как  позиционного,  так  и  именованного  представления.  Если  процедура 
модуля использует объявления, заданные в заголовке, то эти объявления 
можно использовать как с уточняющими именами, так и без них. 


Достарыңызбен бөлісу:
1   ...   155   156   157   158   159   160   161   162   ...   177




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет