Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СБД / Lec_2015 / конспект.doc
Скачиваний:
49
Добавлен:
11.04.2015
Размер:
852.48 Кб
Скачать

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).

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

<<bl_outer>>

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

A number;

C date;

BEGIN -- 1

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

B number;

C char(2);

BEGIN -- 2

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

-- 3

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

В этой программе внешний блок является помеченным меткой bl_outer. Используя эту метку перед переменной, можно во внутреннем блоке обратиться к переменной C типа date – благодаря использованию метки она становится видна..

9.5. Параметры процедур и функций

Параметры процедур и функций могут быть разного вида, и их разрешается передавать по значению или по ссылке.

Таблица 1. Виды параметров

Вид

Описание

IN

Значение фактического параметра передается в процедуру при ее вызове. Внутри процедуры формальный параметр рассматривается в качестве константы PL/SQL – параметра только для чтения – и не может быть изменен. Когда процедура завершается и управление программой возвращается в вызывающую среду, фактический параметр не изменяется.

OUT

Любое значение, которое имеет фактический параметр при вызове процедуры, игнорируется. Внутри процедуры формальный параметр рассматривается как неинициированная переменная PL/SQL, то есть содержит NULL-значение, и можно как записать в него значение, так и считать значение из него. Когда процедура завершается и управление программой возвращается в вызывающую среду, содержимое формального параметра присваивается фактическому параметру (в Oralce 8i этот режим можно изменить с помощью модификатора NOCOPY, позволяющего применять параметр по ссылке).

IN OUT

Этот вид представляет комбинацию видов IN и OUT. Значение фактического параметра передается в процедуру при ее вызове. Внутри процедуры формальный параметр рассматривается в качестве инициализированной переменной, и можно как записать в него значение, так и считать значение из него. Когда процедура завершается и управление программой возвращается в вызывающую среду, содержимое формального параметра присваивается фактическому параметру (в Oralce 8i этот режим можно изменить с помощью модификатора NOCOPY, как и для параметра OUT).

При описании процедур запрещается указывать длину параметров типа CHAR и VARCHAR2, а также точность и/или масштаб параметров типа NUMBER, поскольку ограничения принимаются от фактических параметров. Единственным способом наложить ограничения на формальные параметры является использование атрибута %TYPE. В этом случае ограничение распространяется не на фактический параметр, а на формальный.

CREATE OR REPLACE PROCEDURE myProc

(p_Par1 IN OUT cust.rating%TYPE,

p_Par2 OUT VARCHAR2 DEFALT NULL) IS

BEGIN

p_Par1 := 250;

END myProc;

/

Даже если вызвать процедуру myProc с фактическим параметром другой точности, то будет использоваться точность формального параметра.

Считывание данных из параметра OUT нельзя в Oracle версий, предшествующих Oracle 8i v.8.0.4 (за исключением v 7.3.4).

Если в процедуре или функции нет параметров, то не нужно указывать круглые скобки ни в объявлении подпрограммы, ни в ее вызове.

При вызове подпрограмм с параметрами можно использовать как позиционное представление, так и именное. Позиционное представление используется наиболее часто, и в этом случае параметры перечисляются в том порядке, в каком они описываются в процедуре:

CREATE OR REPLACE PROCEDURE Proc_1 IS

nRtg NUMBER (4) := 120;

vVal VARCHAR(20) := ‘Tokyo’;

BEGIN

MyProc(nRtg, vVal);

END myProc;

/

При именованном представлении для каждого аргумента указывается как формальный, так и фактический параметры. Это позволяет при желании установить собственный порядок аргументов.

CREATE OR REPLACE PROCEDURE Proc_1 IS

nRtg NUMBER (4) := 120;

vVal VARCHAR(20) := ‘Tokyo’;

BEGIN

MyProc(p_Par2 => vVal, p_Par1 => nRtg);

END myProc;

/

Соседние файлы в папке Lec_2015