PLSQL Language Reference-PL/SQL語言基礎-詞彙單元-識別符號的作用域和可見性

LuiseDalian發表於2014-03-07

識別符號的作用域(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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章