我有一个存储过程,它通过传递参数来调用其他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个具有父子关系的不同表上执行插入/更新操作。我想对程序进行回滚,如果在任何程序完成事务中发生任何错误应该回滚,它不应该在数据库中输入任何值。
简而言之,两个存储过程都不应该执行任何操作。
答案 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;
一旦遇到异常,它就会跳转到异常块并回滚事务。然后它将重新引发异常,以便您可以看到它是什么。