Oracle PL / SQL变量范围

变量范围指的是当另一个PL / SQL块可以看到声明的项目时。

在函数或过程的声明部分中声明的任何项只在同一函数或过程中可见。

在包主体的声明部分中声明的任何项只在同一包主体中的任何其他项内可见。

在包规范中声明的任何项目对于调用方法的所有者具有执行特权的任何其他存储函数,存储过程和包是可见的。

 

实施例2

以下代码是测试范围的程序包规范。

create or replace package SCOPE as 
    -- global variable declaration -- from  w w w . j  a  v a2 s .c  o m
    gv_scope varchar2(80) := 'I''m a global (or package spec) variable'; 
    
    -- a package function declaration 
    FUNCTION my_scope_is_global return varchar2; 

    -- a package procedure declaration 
    PROCEDURE my_scope_is_global; 

end SCOPE; 
/ 

以下代码是用于测试范围的包体。


create or replace package SCOPE as 
    -- global variable declaration -- www .j  a  va  2 s  .  c om
    gv_scope varchar2(80) := 'I''m a global (or package spec) variable'; 
    
    -- a package function declaration 
    FUNCTION my_scope_is_global return varchar2; 

    -- a package procedure declaration 
    PROCEDURE my_scope_is_global; 

end SCOPE; 
/ 

create or replace package body SCOPE as 
    -- an package body variable declaration 
    iv_scope varchar2(80) := 'a package body variable'; 
    
    -- package body function declaration 
    FUNCTION my_scope_is_instance return varchar2 is 
        v_answer_1 varchar2(3) := 'Yes'; 
    begin 
        SYS.DBMS_OUTPUT.put_line(chr(9)||'in function'); 
        SYS.DBMS_OUTPUT.put_line(chr(9)||gv_scope); 
        return v_answer_1; 
    end my_scope_is_instance; 

    -- package function declaration 
    FUNCTION my_scope_is_global 
    return varchar2 is 
        v_answer_2 varchar2(3) := 'Yes'; 
    begin 
        SYS.DBMS_OUTPUT.put_line(chr(9)||'procedure'); 
        SYS.DBMS_OUTPUT.put_line(chr(9)||iv_scope); 
        return v_answer_2; 
    end my_scope_is_global; 


    -- package body procedure declaration 
    PROCEDURE my_scope_is_instance is 
        v_answer_3 varchar2(3) := 'Yes'; 
    begin 
        SYS.DBMS_OUTPUT.put_line(chr(9)||'my_scope_is_instance'); 
        SYS.DBMS_OUTPUT.put_line(chr(9)||gv_scope); 
        SYS.DBMS_OUTPUT.put_line(v_answer_3); 
    end my_scope_is_instance; 


    -- package procedure declaration 
    PROCEDURE my_scope_is_global is 
        v_answer_4 varchar2(3) := 'Yes'; 
    begin 
        SYS.DBMS_OUTPUT.put_line(chr(9)||'my_scope_is_global'); 
        SYS.DBMS_OUTPUT.put_line(chr(9)||iv_scope); 
        SYS.DBMS_OUTPUT.put_line(v_answer_4); 
    end my_scope_is_global; 
end SCOPE; 
/ 

以下代码显示如何使用软件包SCOPE。

declare -- from  ww w  . j av  a 2  s . c  o  m
    v_scope varchar2(40) := 'a local variable'; 
    -- This is a local (or embedded) function 
    FUNCTION my_scope_is_local 
    return varchar2 is 
        v_answer_0 varchar2(3) := 'Yes'; 
    begin 
        return v_answer_0; 
    end my_scope_is_local; 

    -- This is a local (or embedded) procedure 
    PROCEDURE my_scope_is_local is 
        v_answer varchar2(3) := 'Yes'; 
    begin 
        SYS.DBMS_OUTPUT.put_line(v_answer); 
    end my_scope_is_local; 

begin 
    SYS.DBMS_OUTPUT.put_line(v_scope); 
    SYS.DBMS_OUTPUT.put_line('Can I access SCOPE'' global variable?'); 
    SYS.DBMS_OUTPUT.put_line(SCOPE.gv_scope); 
    SYS.DBMS_OUTPUT.put_line('Can I access SCOPE'' instance variable?'); 
    
    SYS.DBMS_OUTPUT.put_line(my_scope_is_local()); 
    SYS.DBMS_OUTPUT.put_line('Can I access SCOPE'' global function?'); 
    SYS.DBMS_OUTPUT.put_line(SCOPE.my_scope_is_global()); 
    SYS.DBMS_OUTPUT.put_line('Can I access SCOPE'' instance function?'); 
    
    SYS.DBMS_OUTPUT.put_line('Can I access my local procedure?'); 
    my_scope_is_local(); 
    SYS.DBMS_OUTPUT.put_line('Can I access SCOPE'' global procedure?'); 
    SCOPE.my_scope_is_global(); 
    SYS.DBMS_OUTPUT.put_line('Can I access SCOPE'' instance procedure?'); 
end; 
/