在开始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值的与或非