Seb*_*bas 6 plsql transactions 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(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;
Run Code Online (Sandbox Code Playgroud)
所以,你可以看到有一个错误test2(),它会提升test(),然后在err_manager()方法中处理.
所以我有两个问题:
非常感谢你.S.
Vin*_*rat 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.
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
5621 次 |
| 最近记录: |