存储过程事务回滚

时间:2014-04-18 04:34:14

标签: sql stored-procedures oracle11g

我有一个存储过程,它通过传递参数来调用其他2个存储过程。例如:

abc.xxssd.MES_LOG_PKG.insert_row(p_msg_guid,p_payload_type);
abc.xxssd.MES_PAY_PKG.insert_row(p_msg_guid,p_payload_type,p_payload);

这两个存储过程都在2个具有父子关系的不同表上执行插入/更新操作。我想对程序进行回滚,如果在任何程序完成事务中发生任何错误应该回滚,它不应该在数据库中输入任何值。

简而言之,两个存储过程都不应该执行任何操作。

2 个答案:

答案 0 :(得分:0)

您可以在每个过程中添加一个try / catch子句:

begin try

 begin tran tr1

-- your instruction/query


commit tran  tr1
end try
begin catch

rollback tran tr1

end catch

例如:

begin try

begin tran 

exec procedure1(param1,param2)

--in ur case the first procedure works fine so we gonna save point 

save tran Savepoint1

exec procedure2(param1,param2)

commit tran 
end try 

begin catch

rollback tran Savepoint1

end catch

注意:此t-sql仅适用于SqlServer,而不适用于Oracle。 您可以找到等效的instructions for Oracle

答案 1 :(得分:0)

你想要一个像这样的块:

BEGIN
    [... stuff here...]
    abc.xxssd.MES_LOG_PKG.insert_row(p_msg_guid,p_payload_type);
    abc.xxssd.MES_PAY_PKG.insert_row(p_msg_guid,p_payload_type,p_payload);
EXCEPTION WHEN OTHERS THEN
    ROLLBACK;
    RAISE;
END;

一旦遇到异常,它就会跳转到异常块并回滚事务。然后它将重新引发异常,以便您可以看到它是什么。