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