调试经验——使用嵌套结构捕捉PL/SQL中声明部分出现的异常

问题描述:

教材中有这么一段PL/SQL代码块,在测试过程中,我故意为替换变量sv_zip赋值123456,让其溢出,看看代码中的异常处理部分能否捕捉到这一异常。

DECLARE
      v_exists           NUMBER (1);
      v_total_students   NUMBER (1);
      v_zip              CHAR (5) := '&sv_zip';
   BEGIN
      SELECT COUNT (*)
        INTO v_exists
        FROM zipcode
       WHERE zip = v_zip;

      IF v_exists != 0
      THEN
         SELECT COUNT (*)
           INTO v_total_students
           FROM student
          WHERE zip = v_zip;

         DBMS_OUTPUT.PUT_LINE (
            'There are ' || v_total_students || ' students');
      ELSE
         DBMS_OUTPUT.PUT_LINE (v_zip || ' is not a valid zip');
      END IF;
   EXCEPTION
      WHEN VALUE_ERROR OR INVALID_NUMBER
      THEN
         DBMS_OUTPUT.PUT_LINE ('An error has occurred');
   END;

没想到,代码直接报错。

 

这个错误属于数据长度不匹配导致的“VALUE_ERROR”,但是这段代码并没有捕捉到该错误,原因可能是PL/SQL声明部分出错,并不在异常处理的作用范围内。

我的直觉告诉我,在代码外围再“包”一层,通过嵌套说不定可以捕捉该错误。

修改后的代码如下:

/* Formatted on 2018/11/3 3:26:30 (QP5 v5.256.13226.35538) */
BEGIN
   DECLARE
      v_exists           NUMBER (1);
      v_total_students   NUMBER (1);
      v_zip              CHAR (5) := '&sv_zip';
   BEGIN
      SELECT COUNT (*)
        INTO v_exists
        FROM zipcode
       WHERE zip = v_zip;

      IF v_exists != 0
      THEN
         SELECT COUNT (*)
           INTO v_total_students
           FROM student
          WHERE zip = v_zip;

         DBMS_OUTPUT.PUT_LINE (
            'There are ' || v_total_students || ' students');
      ELSE
         DBMS_OUTPUT.PUT_LINE (v_zip || ' is not a valid zip');
      END IF;
   EXCEPTION
      WHEN VALUE_ERROR OR INVALID_NUMBER
      THEN
         DBMS_OUTPUT.PUT_LINE ('An error has occurred');
   END;
EXCEPTION
   WHEN VALUE_ERROR OR INVALID_NUMBER
   THEN
      DBMS_OUTPUT.PUT_LINE ('An error has occurred and was caught in outter block');
END;

相比之下,这段代码的健壮性得到了提高!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值