标识符的作用域(scope)和可见性(visibility)
标识符的scope是指在PL/SQL单元中可以引用该标识符的区域。
标识符的可见性是指可以不使用限定来引用该标识符的PL/SQL单元的区域。
在PL/SQL单元中声明的标识符是本地的;如果该PL/SQL单元有子单元,则对于子单元来讲是全局的。
如果子单元重新定义了一个和全局标识符同名的标识符,则在子单元内部2个标识符都在scope中,但只有本地的标识符是可见的。为了引用全局的标识符,子单元必须使用定义的单元的名称来限定它,如果定义全局标识符的单元没有名称,则不能引用。
PL/SQL单元不能引用平级的其它单元中声明的标识符,因为这些标识符对于块来讲即不是本地的也不是全局的。
-- 外部块 DECLARE a CHAR; -- a(CHAR)的scope开始 b REAL; -- b的scope开始 BEGIN -- a(CHAR), b可见
-- 第1个子块 DECLARE a INTEGER; -- a(INTEGER)scope开始 c REAL; -- c的scope开始 BEGIN -- a(INTEGER), b, c可见 NULL; END; -- a(INTEGER)和c的scope结束
-- 第2个子块 DECLARE d REAL; -- d的scope开始 BEGIN -- a(CHAR), b, d可见 NULL; END; -- d的scope结束
-- a(CHAR), b可见 END; |
<<outer>> -- 标签 DECLARE birthdate DATE := to_date('09-08-70', 'DD-MM-YYYY'); BEGIN DECLARE birthdate DATE := to_date('29-09-70', 'DD-MM-YY'); BEGIN --前者是本地的,后者是限定的全局的 IF birthdate = outer.birthdate THEN DBMS_OUTPUT.PUT_LINE ('相同的生日'); ELSE DBMS_OUTPUT.PUT_LINE ('不同的生日'); END IF; END; END;
|
CREATE OR REPLACE PROCEDURE check_credit (credit_limit NUMBER) AS rating NUMBER := 3; --全局变量 --子程序 FUNCTION check_rating RETURN BOOLEAN IS rating NUMBER := 1; --本地变量 over_limit BOOLEAN; BEGIN IF check_credit.rating <= credit_limit THEN -- 引用全局变量(使用过程名来限定) over_limit := FALSE; ELSE over_limit := TRUE; rating := credit_limit; -- 引用本地量 END IF; RETURN over_limit; END check_rating; BEGIN IF check_rating THEN DBMS_OUTPUT.PUT_LINE ('信用等级超出限制 (' || TO_CHAR(credit_limit) || '). ' || '等级: ' || TO_CHAR(rating)); ELSE DBMS_OUTPUT.PUT_LINE('信用等级OK. ' || '等级: ' || TO_CHAR(rating)); END IF; END;
BEGIN check_credit(1); END;
|
不能在同一PL/SQL单元中声明相同的标识符,如果声明了,则在引用时会产生错误。
DECLARE id BOOLEAN; id VARCHAR2(5); -- 重复声明 BEGIN id := FALSE; END; |
--在不同的PL/SQL单元中声明同名变量 DECLARE PROCEDURE p IS x VARCHAR2(1); BEGIN x := 'a'; DBMS_OUTPUT.PUT_LINE('在过程P中, x = ' || x); END;
PROCEDURE q IS x VARCHAR2(1); BEGIN x := 'b'; DBMS_OUTPUT.PUT_LINE('在过程q中, x = ' || x); END; BEGIN p; q; END;
|
-- 子程序和块具有相同的名称echo <<echo>> DECLARE x NUMBER := 5;
PROCEDURE echo AS x NUMBER := 0; BEGIN --都是指本地的x DBMS_OUTPUT.PUT_LINE('x = ' || x); DBMS_OUTPUT.PUT_LINE('echo.x = ' || echo.x); END; BEGIN echo; END;
|
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1102776/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17013648/viewspace-1102776/