Transactions 自治事务范围和错误引发
我有点怀疑。让我们假设这个包的程序:Transactions 自治事务范围和错误引发,transactions,plsql,oracle10g,Transactions,Plsql,Oracle10g,我有点怀疑。让我们假设这个包的程序: 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(SQLER
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\u manager()
方法中处理
所以我有两个问题:
err\u 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.