Oracle Database 10g PL/SQL Programming - PL/SQL块之嵌套块异常处理规则

    PL/SQL块中还可以包含其他子块,即嵌套,在代码块的异常处理部分和执行部分都允许在嵌套块,但是在声明部分不允许存在嵌套块。

    让我们来研究下下面的这个例子,创建一个带有两个嵌套块的匿名块,且这两个嵌套块是在同一个嵌套层次上。

 

DECLARE
   v_neusoft AUTHORS.FIRST_NAME%TYPE;
BEGIN

   -- the first nested block
   BEGIN
      SELECT first_name
      INTO v_neusoft
      FROM authors
      WHERE UPPER(last_name) = 'NIMENG';
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         DBMS_OUTPUT.PUT_LINE('EXCEPTION HANDLER for nested block 1');
         DBMS_OUTPUT.PUT_LINE('    ');
         NULL;
   END;
  
   -- the second nested block
   BEGIN
      SELECT first_name
      INTO v_neusoft
      FROM authors
      WHERE UPPER(last_name) = 'HARDMAN';

   EXCEPTION
      WHEN TOO_MANY_ROWS
      THEN
         DBMS_OUTPUT.PUT_LINE('    ');
         DBMS_OUTPUT.PUT_LINE('EXCEPTION HANDLER for nested block 2');
   END;
END;

 

    让我们从这里例子中来理解嵌套块的使用,以及嵌套块异常处理的规则。

    两个嵌套块都有异常,而且都有异常处理子程序。在第一个嵌套块中,我们检索不到任何数据,由于检索的值为NULL,因此引发ORA-1403 no data found 异常,这里我们使用内置NO_DATA_FOUND异常,只要发生ORA-1403 no data found 异常,我们就可以捕获它。在第二个嵌套块中,我们检索出多条数据,导致发生 too many rows 异常,这里我们依然使用内置异常 TOO_MANY_ROWS来捕获它。

    执行结果,打印出了:

 

    EXCEPTION HANDLER for nested block 1

    EXCEPTION HANDLER for nested block 2

 

     从执行结果中,我们发现了什么?这里发生了一个很有趣的现象,第一个嵌套块中查询语句发生了异常,第二个嵌套块中的查询语句依然执行。而如果这两条查询语句是在同一个大块中,而不是在两个嵌套块中,执行结果是什么?读者你可能猜的到?

     执行结果,打印出了:

 

     EXCEPTION HANDLER for nested block 1

 

     这说明,如果两条查询语句是在同一个大块中,而不是在两个嵌套块中,第一个查询语句发生的异常,使所有其余代码都不能执行。

     亲爱的的读者,通过这个例子,您可掌握了嵌套块的使用,以及异常处理的规则?

     读者还要注意第一个嵌套块中的异常处理部分以NULL结尾,表示下面要忽略这里薄面的一擦和那个,ORACLE就会像什么异常都没有发生过一样,继续处理第二条查询语句了。

     希望能对您有用!

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值