Конспект лекций по дисциплине «Сетевые базы данных», страница 28

(p_City IN varchar2)

RETURN number IS

cnt number;

BEGIN

select count(*) into cnt from sal where cyti= p_City;

RETURN cnt;

END my_func;

/

9.3. Пакеты

Хранимая процедура – это минимальная программная единица в базе данных Oracle. Однако, существует возможность сгруппировать несколько процедур в пакет. Этот пакет можно считать приложением, которое содержит несколько процедур. Для создания пакета используется следующий формат:

CREATE [OR REPLACE] PACKAGE name IS

(определение общедоступных переменных, процедур и функций)

END [name];

CREATE [OR REPLACE] PACKAGE BODY name IS

(определение локальных переменных, процедур и функций)

(реализация процедур и функций)

[BEGIN

(инициализация)]

END [name];

Здесь определения процедур и функций аналогичны тем, которые создаются командой CREATE PROCEDURE. Но поскольку они уже находятся в пакете, в них не нужно включать слова "CREATE OR REPLACE".

Существует еще одна конструкция, встроенная Oracle в определение пакета. Процедуры и функции, включенные в состав пакета, доступны многим пользователям (при наличии привилегий). Вместе с тем, Oracle позволяет определить защищенные (скрытые) компоненты, используемые только процедурам и функциям из общедоступного раздела. Скрытые процедуры размещаются в так называемом теле пакета (package body), как это показано в следующем примере.

CREATE OR REPLACE PACKAGE score_all

AS

PROCEDURE score_answers

(custid IN NUMBER,

term IN NUMBER DEFAULT 30) ;

END;

CREATE OR REPLACE PAKAGE BODY score_all

AS

PROCEDURE letter_grade

IS

(объявления переменных)

BEGIN

(операторы SQL и PL/SQL)

END letter_grade;

PROCEDURE score_answers

(custid IN NUMBER,

term IN NUMBER DEFAULT 30)

IS

(определение переменных)

BEGIN

(операторы SQL и PL/SQL)

END;

END;

            9.4. Области действия и область видимости переменных

Область действия переменных – это фрагмент программы, в котором возможно обращение к этой переменной. Для переменной PL/SQL – это фрагмент с момента ее объявления и до конца блока. Это показано в следующем примере.

DECLARE -- начало внешнего блока

A number;

BEGIN

DECLARE   -- начало внутреннего блока

B number;

BEGIN

END;     -- конец внутреннего блока

END;  -- конец внешнего блока

Здесь переменная A имеет область действия и во внешнем блоке и во внутреннем. Для переменной B  областью действия является только внутренний блок.

Область видимости переменной – это фрагмент программы, в котором возможно обращение к этой переменной без дополнительных квалификаторов. Область видимости всегда лежит в пределах области действия; если переменная находится вне области своего действия, она невидима. Рассмотрим следующий пример.

DECLARE -- начало внешнего блока

A number;

C date;

BEGIN  -- 1

DECLARE   -- начало внутреннего блока

B number;

C char(2);

BEGIN  -- 2

END;     -- конец внутреннего блока

-- 3

END;  -- конец внешнего блока

В этой программе в точке 1 видимы переменные A и C типа date. В точке 2 видимы переменные A, B и C типа char(2), а переменная C типа date не видна хотя и находится в области своего действия. Дело в том, что объявленная во внутреннем блоке переменная C (т.е. переменная с таким же именем) перекрывает видимость переменной C, определенной во внешнем блоке. В точке 3 видимы переменные A и C типа date, которая снова становится видна, т.к. закончилась область действия переменной C типа char(2).

Если переменная находится в своей области действия, но не видна – то как обратиться к ней в программе? Рассмотрим пример, в котором программа из предыдущего примера несколько изменена.