我有些怀疑。让我们假设这个软件包的程序:
PROCEDURE ERR_MANAGER(I_ERRM IN VARCHAR2) IS
BEGIN
ROLLBACK;
--DO SOME STUFF
END ERR_MANAGER;
PROCEDURE test IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
test2;
COMMIT;
EXCEPTION WHEN OTHERS THEN ERR_MANAGER(SQLERRM);
END test;
PROCEDURE test2 IS
BEGIN
--DO SOME TRANSACTIONNAL DML
RAISE_APPLICATION_ERROR(-20001, 'ERR'); --for the test purpose, in reality this could be any actual error
END test2;
您可以看到test2()
中存在错误,该错误会上升至test()
,然后在err_manager()
方法中处理。
所以我有两个问题:
err_manager()
的范围是什么?它是否仍在自主事务内?我猜应该是,因为它只是一个函数调用,但我想确保- 如果由于一个错误而强制退出自主事务,并且没有进行任何提交或回滚,会发生什么情况?
非常感谢。 S.