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

本文通过一个SQL语句实例,深入解析PL/SQL变量的作用范围,包括局部变量、全局变量以及它们之间的引用和影响。

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







 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值