Sql 存储过程事务回滚

Sql 存储过程事务回滚,sql,stored-procedures,oracle11g,Sql,Stored Procedures,Oracle11g,我有一个存储过程,它通过传递参数来调用另外两个存储过程。例如: 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); 这两个存储过程都对具有父子关系的两个不同表执行插入/更新操作。我想对过程进行回滚,如果在任何过程中发生任何错误,则完整事务应该回滚,并且不应该在DB中输入任何值 简而言之

我有一个存储过程,它通过传递参数来调用另外两个存储过程。例如:

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);
这两个存储过程都对具有父子关系的两个不同表执行插入/更新操作。我想对过程进行回滚,如果在任何过程中发生任何错误,则完整事务应该回滚,并且不应该在DB中输入任何值


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

您可以在每个过程中添加一个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中不工作。
您可以找到等效的

您想要一个类似这样的块:

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;

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

嗨,Simo-感谢您的回复。。。这是我的案子。。。通过第一个过程成功插入数据,但在第二个过程中失败。。所以在我的情况下,我也不想在第一次提交数据..你可以使用一个SAVE station希望它保存你事务的状态,这意味着如果出现错误,回滚将在SAVE station之后和之前取消所有指令这里是我的情况。。。通过第一个过程成功插入数据,但在第二个过程中失败。。所以在我的例子中,我不想在第一个中提交数据。。