我有点怀疑。让我们假设这个包的过程:
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()
中处理方法。所以我有两个问题:
非常感谢。
S。
最佳答案
err_manager
执行的事务范围过程是调用自治事务,你是对的。过程和函数继承它们的调用事务,除非它们本身是自治事务。
SQL> CREATE TABLE t (id number);
Table created.
SQL> DECLARE
2 l NUMBER;
3 PROCEDURE p IS
4 pragma autonomous_transaction;
5 BEGIN
6 insert into t values (1);
7 raise_application_error(-20001, 'rollback?');
8 END;
9 BEGIN
10 p;
11 EXCEPTION
12 WHEN OTHERS THEN
13 DBMS_OUTPUT.put_line('error catched:' || sqlcode);
14 SELECT COUNT(*) INTO l FROM t;
15 DBMS_OUTPUT.put_line('lines in t: ' || l);
16 END;
17 /
error catched:-20001
lines in t: 0
PL/SQL procedure successfully completed.
关于transactions - 自治事务范围和错误引发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12160503/