我想编写一个从两个表中删除数据的存储过程。 如果其中一个删除失败,我想确保没有删除任何数据。
这应该是一项简单的任务,但我以前从未在Oracle工作过。 我不应该使用TRY / CATCH,TRANSACTIONS或SAVEPOINTS。
任何指导都将不胜感激。
目前我有:
CREATE OR REPLACE PROCEDURE SP_DELETE_STUFF
(
GROUPNAME IN VARCHAR2
) AS
BEGIN
SAVEPOINT Original_Start;
-- First delete all permissions for a given group
DELETE FROM my_table_1
WHERE group_name = GROUPNAME;
-- Second delete the group
DELETE FROM my_table_2
WHERE group_name = GROUPNAME;
EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK TO SAVEPOINT Original_Start;
COMMIT;
END;
END
答案 0 :(得分:2)
如果您的目标只是回滚存储过程的特定调用在发生错误时所做的更改,那么您将使用savepoint
和rollback to savepoint
,就像您在此处所做的那样。
我会质疑您在commit
之后使用rollback to savepoint
。这将提交存储过程的调用者已启动的事务。当您的过程遇到错误时,您似乎不太可能要提交调用者的更改。所以我希望您删除commit
。
与事务范围无关,我还希望您至少重新引发捕获的异常,以便调用者知道存在失败。我希望你会想要像
这样的东西 EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK TO SAVEPOINT Original_Start;
RAISE;
END;