如何从RAISED异常中获取oracle PL / SQL中原始异常的堆栈跟踪?
发布时间:2021-03-07 11:23:28 所属栏目:百科 来源:网络整理
导读:我有一个问题,当我捕获异常时,原始堆栈跟踪丢失,然后提高它. 在proc_a中抛出异常 抓住例外. 执行回滚. 提出异常. 捕获异常(父块) 打印堆栈跟踪:SUBSTR(SQLERRM || chr(10)|| DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(),1,3999) 例: DECLAREBEGIN DECLARE lv
|
我有一个问题,当我捕获异常时,原始堆栈跟踪丢失,然后提高它. >在proc_a中抛出异常 例: 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 消息排序略有不同,但信息仍然存在. (编辑:源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



