您的位置:首页 > 数据库

PL/SQL0.1——块嵌套与变量范围

2012-04-11 19:52 239 查看
在开始plsql编程之前,我们先对plsql变量的作用范围看一下:



应该是和一般的编程语言是一样的,可能我们对这个图看上去不能理解,我们通过下面一条sql语句来进行全面理解:

SQL> BEGIN

  2    <<outer>>

  3    DECLARE

  4        v_sal     NUMBER(7, 2) := 60000;

  5        v_comm    NUMBER(7, 2) := v_sal * 0.20;

  6        v_message VARCHAR2(255) := ' eligible for commission';

  7    BEGIN

  8      <<inner>>

  9      DECLARE

 10        v_sal        NUMBER(7, 2) := 50000;

 11        v_comm       NUMBER(7, 2) := 0;

 12        v_total_comp NUMBER(7, 2) := v_sal + v_comm;

 13      BEGIN

 14        v_message    := ' CLERK not' || v_message;

 15        outer.v_comm := v_sal * 0.30;

 16        DBMS_OUTPUT.PUT_LINE('m is '||v_message||' v_comm '||v_comm||' OUTER '||outer.v_comm);
 17      END;--<<inner>>

 18      v_message := 'SALESMAN' || v_message;

 19      DBMS_OUTPUT.PUT_LINE('v_total_comp is '||'v_total_comp/null'||' v_comm is  '||v_comm||' v_mess is '||v_message);

 20    END;--<<outer>>

 21   END;

 22  /

 

m is  CLERK not eligible for commission v_comm 0 OUTER 15000

v_total_comp is v_total_comp/null v_comm is  15000 v_mess is SALESMAN CLERK not eligible for commission

 

PL/SQL procedure successfully completed

 

SQL> 

我们通过看这两条红色的输出结果集,就能理解变量的控制范围了:

第16行:v_message结果为:CLERK not eligible for commission 内部块的CLERK not  然后加外部的eligible for commission 。外部的v_comm引用了内部的v_sal=5000*0.3

第19行:v_total_comp是不能得出结果的,所以输出了字符串,因为是在outer的语句。即使我写成:  DBMS_OUTPUT.PUT_LINE('v_total_comp is '||inner.v_total_comp||' v_comm is  '。。。。

也是报错:ORA-06550: line 20, column 52:

                  PLS-00219: label 'INNER' reference is out of scope

继续看v_comm 因为plsql是顺序向下执行的,inner部分结束时outer.v_comm=15000,现在还是这个值。为什么v_message的值变成了SALESMAN CLERK not eligible for commission也就是说加上了inner 部分?刚开始可能会晕,但是你只要注意到,在inner部分根本就没有再次声明这个变量,也就是说从头到尾这个变量就声明了一次,所以他会一直使用。

2、plsql中null值的与或非



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息