PLSQL Language Reference-PL/SQL语言基础-词汇单元-标识符的作用域和可见性

标识符的作用域(scope)和可见性(visibility)

标识符的scope是指在PL/SQL单元中可以引用该标识符的区域。

标识符的可见性是指可以不使用限定来引用该标识符的PL/SQL单元的区域。

PL/SQL单元中声明的标识符是本地的;如果该PL/SQL单元有子单元,则对于子单元来讲是全局的。

 

如果子单元重新定义了一个和全局标识符同名的标识符,则在子单元内部2个标识符都在scope中,但只有本地的标识符是可见的。为了引用全局的标识符,子单元必须使用定义的单元的名称来限定它,如果定义全局标识符的单元没有名称,则不能引用。

PL/SQL单元不能引用平级的其它单元中声明的标识符,因为这些标识符对于块来讲即不是本地的也不是全局的。


 

-- 外部块

DECLARE

    a CHAR;         -- a(CHAR)scope开始

    b REAL;     -- bscope开始

BEGIN

    -- a(CHAR), b可见

 

    -- 1个子块

    DECLARE

        a INTEGER;      -- a(INTEGER)scope开始

        c REAL;         -- cscope开始

    BEGIN

        -- a(INTEGER), b, c可见

        NULL;

    END;                -- a(INTEGER)cscope结束

 

    -- 2个子块

    DECLARE

        d REAL;     -- dscope开始

    BEGIN

        -- a(CHAR), b, d可见

        NULL;

    END;            -- dscope结束

 

    -- 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值