我有点怀疑。让我们假设这个包的程序:
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上。
答案 0 :(得分:10)
执行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.