设为首页 - 加入收藏 PHP编程网 - PHP站长网 (http://www.52php.cn)- 电商,百科,编程,业界,移动互联,5G,云计算,站长网!
热搜: google 娱乐 服务 百度
当前位置: 首页 > 站长百科 > 正文

如何从RAISED异常中获取oracle PL / SQL中原始异常的堆栈跟踪?

发布时间:2021-05-14 12:09 所属栏目:[站长百科] 来源:网络整理
导读:我有一个问题,当我捕获异常时,原始堆栈跟踪丢失,然后提高它. 在proc_a中抛出异常 抓住例外. 执行回滚. 提出异常. 捕获异常(父块) 打印堆栈跟踪:SUBSTR(SQLERRM || chr(10)|| DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(),1,3999) 例: DECLAREBEGIN DECLARE lv

我有一个问题,当我捕获异常时,原始堆栈跟踪丢失,然后提高它.

>在proc_a中抛出异常
>抓住例外.
>执行回滚.
>提出异常.
>捕获异常(父块)
>打印堆栈跟踪:SUBSTR(SQLERRM || chr(10)|| DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(),1,3999)

例:

DECLARE
BEGIN
   DECLARE
      lv_val VARCHAR2(1);
   BEGIN
      SELECT dummy INTO lv_val -- Line# 6 (desired)
      FROM   dual
      WHERE  dummy = 'FFF';
   EXCEPTION
      WHEN OTHERS THEN
         --DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM || chr(10) || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(),3999));
         RAISE; -- Line# 12 (actual)
   END;
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM || chr(10) || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(),3999));
END;
/

期望的结果:

原始异常的行号(步骤1).

ORA-01403: no data found
ORA-06512: at line 6

要么

ORA-01403: no data found
ORA-06512: at line 12
Caused By:
ORA-01403: no data found
ORA-06512: at line 6

实际结果:

RAISE的行号(步骤4).

ORA-01403: no data found
ORA-06512: at line 12

失败的其他尝试:

SQLERRM || chr(10)|| DBMS_UTILITY.FORMAT_ERROR_STACK()

ORA-01403: no data found
ORA-01403: no data found

SQLERRM || chr(10)|| DBMS_UTILITY.FORMAT_CALL_STACK()

ORA-01403: no data found
----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
0xee1cbd68        18  anonymous block

解决方法

在内部异常处理程序中,不使用RAISE procdure,而是使用RAISE_APPLICATION_ERROR过程将dbms_utility.format_error_backtrace函数的结果传递给它以获取原始行号:

BEGIN
   DECLARE
      lv_val VARCHAR2(1);
   BEGIN
      SELECT dummy INTO lv_val -- Line# 6 (desired)
      FROM   dual
      WHERE  dummy = 'FFF';
   EXCEPTION
      WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20001,dbms_utility.format_error_backtrace,true);
   END;
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM || chr(10) || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(),3999));
END;
/

如果没有外部异常处理程序,您将收到以下错误报告:

Error report -
ORA-20001: ORA-06512: at line 5
ORA-06512: at line 10
ORA-01403: no data found

使用外部异常处理程序,您将获得以下内容:

ORA-20001: ORA-06512: at line 5
ORA-01403: no data found
ORA-06512: at line 10

消息排序略有不同,但信息仍然存在.

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

推荐文章
热点阅读