【发布时间】:2015-11-25 16:21:34
【问题描述】:
我有一个程序可以对不同的表进行多次更新。如果过程中的任何地方发生任何错误,我希望所有更改都回滚。因此我使用了这个结构:
CREATE PROCEDURE foo (x NUMBER) IS
BEGIN
-- Do some inserts here.
INSERT INTO bar VALUES (x);
-- Sometimes there might be an error.
IF x = 3 THEN
RAISE_APPLICATION_ERROR(-20000, 'Wooops...');
END IF;
EXCEPTION
WHEN OTHERS THEN
--Rollback all the changes and then raise the error again.
ROLLBACK;
RAISE;
END foo;
问题在于,这会回滚自上次提交以来所做的所有事情,而不仅仅是过程所做的更改。例如,这将插入 4 和 5,但 1 和 2 将被回滚:
BEGIN
FOR x IN 1..5 LOOP
BEGIN
foo(x);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END LOOP;
END;
如何让程序仅回滚在此调用期间程序所做的更改?我想我应该以某种方式使用事务,但我不确定如何设置它。
请注意,我想在过程的代码中解决这个问题,而不是在调用它的代码中。
【问题讨论】:
-
查看 oracle 保存点 docs.oracle.com/cd/B19306_01/server.102/b14200/…
标签: oracle stored-procedures plsql transactions rollback