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值的与或非
应该是和一般的编程语言是一样的,可能我们对这个图看上去不能理解,我们通过下面一条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值的与或非
相关文章推荐
- pl/sql 中变量定义范围的小例子:
- PL/SQL之变量的作用范围
- Oracle PL/SQL变量、常量、流程控制、循环语句
- PL/SQL中,declare定义变量和variable定义变量的区别?
- PL-SQL演示_声明变量
- oracle PL/SQL的基本构成,块结构和基本语法要求,数据类型,变量定义,运算符和函数
- pl/sql学习1——标量变量
- pl/sql存储过程中游标嵌套的实现方法
- pl/sql之定义并使用变量,复合类型
- PL/SQL--变量
- 在oracle的PL程序块中执行一个varchar2类型变量中的sql 语句
- PL/SQL 数据类型和变量 -- 字符
- PL/SQL游标变量的调用与作为输出参数的应用
- PL/SQL 11g R2 —— 定义PL/SQL变量 !
- PL/SQL 调试存储过程(报错ora-01036 非法的变量名/编号)
- PL/SQL复合变量
- PL/SQL里拼接SQL的查询结果赋值给一个变量
- PL/SQL 变量
- PL/SQL拼接和使用绑定变量
- pl/sql存储过程中游标嵌套的实现方法