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

前端之家收集整理的这篇文章主要介绍了如何从RAISED异常中获取oracle PL / SQL中原始异常的堆栈跟踪?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个问题,当我捕获异常时,原始堆栈跟踪丢失,然后提高它.

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

例:

@H_404_20@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).

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

要么

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

实际结果:

RAISE的行号(步骤4).

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

失败的其他尝试:

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

@H_404_20@ORA-01403: no data found ORA-01403: no data found

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

@H_404_20@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函数的结果传递给它以获取原始行号:

@H_404_20@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; /

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

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

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

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

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

猜你在找的Oracle相关文章