【发布时间】:2019-10-24 04:49:40
【问题描述】:
这是我的程序的一部分。过程失败时没有发生回滚。
1. 是否应该在引发应用程序错误之前发出回滚?
2. 在这种情况下,将使用引发应用程序错误进行回溯工作。它在日志表中进行跟踪。但是想知道如果回滚,引发应用程序错误是否会正确发出回溯。
EXCEPTION
WHEN OTHERS THEN
/*Log that some other error occured and backtrace*/
eps_datareduction_run_log ( 5, 'CREDIT', current_timestamp, 'FAILED', 'CREDIT: Error Number:'||sqlcode||'Error Code:'||substr(sqlerrm, 1, 200)||'-backtrace:'||dbms_utility.format_error_backtrace, sysdate, user, null, null );
lv_err_msg := 'Unexcpected Error '||SUBSTR(sqlerrm,1,255);
raise_application_error(-20000,lv_err_msg || '- backtrace - ' || dbms_utility.format_error_backtrace);
ROLLBACK;
【问题讨论】:
-
将回滚放在
EXCEPTION WHEN OTHERS THEN之后,并在其后执行其他逻辑。 -
您的脚本在发出
raise_application_error时终止,而ROLLBACK永远不会执行。 -
修改
eps_datareduction_run_log可能是个好主意,这样它就可以捕获错误并自己调用堆栈详细信息,并且每次调用都不必构建复杂的连接字符串。