2014-04-18 125 views
0

我有一個存儲過程通過傳遞參數來調用另外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個不同表執行插入/更新操作。我想回滾過程,如果在任何過程中發生任何錯誤,完整的事務應該回滾並且不應該向DB中輸入任何值。

總之,這兩個存儲過程都不應該執行任何操作。

+0

這裏是我的情況...數據通過第一個過程成功插入,但在第二個失敗..所以在我的情況下,我不想在第一個數據提交也.. – kumarb

回答

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的不是甲骨文。 你可以找到相當於instructions for Oracle

+0

嗨西莫 - 感謝您的迴應。 .. 這裏是我的情況...數據通過第一個過程成功插入,但第二個失敗..所以在我的情況下,我不想在第一個數據提交數據.. – kumarb

+0

你可以使用SAVE聲明希望它保存你的交易的狀態,這意味着如果出現錯誤,回滾將取消所有指令,並且在它將被執行之前取消 – Simo

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; 

一旦遇到異常,它會跳下來的異常塊和回滾事務。然後它會重新提出異常,以便看到它是什麼。