2011-08-24 89 views
14

我想知道是否可以在1次執行多個sql語句。 例如,我想從多個表中刪除行的情況下,是有辦法,我可以做這樣的事情..MyBatis一次執行多個sql語句,這可能嗎?

<delete id="delete" parameterType="String"> 
    DELETE FROM DUMMYTABLE_A where X=${value} 
    DELETE FROM DUMMYTABLE_B where X=${value} 
</delete> 

回答

14

是,大多數數據庫允許這一點。通常你必須用一些東西來劃分你的SQL語句。在PostGRES和MySQL中,它是一個分號(;)。在Microsoft SQL服務器中,您應該使用關鍵字GO。 [2013年5月更新:從SQL Server 2012開始,您可以並應該使用分號分隔您的語句。在SQL Server 2012之後(即下一版本和更高版本),這些將是強制性的。使用GO現在是在SQL2012及更高版本中做事的不贊成使用的方式)。 ]

的MySQL/POSTGRES例如:

DELETE FROM DUMMYTABLE_A where X=${value}; 
DELETE FROM DUMMYTABLE_B where X=${value}; 
DELETE FROM DUMMYTABLE_C where X=${value}; 

MS-SQL例如:

DELETE FROM DUMMYTABLE_A where X=${value} 
GO 
DELETE FROM DUMMYTABLE_B where X=${value} 
GO 
DELETE FROM DUMMYTABLE_C where X=${value} 

更好的數據庫(即,不是MySQL的。)也將支持與BEGIN TRAN/COMMIT TRAN/ROLLBACK TRAN交易。使用事務可以實際將所有語句批處理成一個原子操作,如果部分操作失敗,所有三個語句都會回滾。有關這些的更多信息,請參閱http://www.sqlteam.com/article/introduction-to-transactions

儘管您最需要的是SQL語句之間的分號!

+1

我不知道,但這並不爲我工作我附上下一個要點https://gist.github.com/AdelinGhanaem/b565ca3a447e89087ab7你可以看到,它不與兩個分開的語句'查詢'與回滾... – Adelin

+2

我試過這種方式,myBatis拋出一個異常。問題在於我沒有在JDBC URL中設置標誌allowMultiQueries = true。謝謝。 –

+0

這對我不起作用,我試圖通過'in'條件刪除兩批數據,但是我得到了sql語法語法錯誤。 –

16

我正在使用myBatis和Oracle。我想在其他數據庫中有類似的東西。實際上,當你需要支持這個項目時,你總是可以在DB中創建過程,這通常對未來更好。

<delete id="deleteUnfinishedData" parameterType="map"> 
    {call 
     declare 
     begin 
      delete from TABLE1 where id = #{valueFromMap1}; 
      delete from TABLE2 where id = #{valueFromMap2}; 
     end 
    } 
</delete> 
+1

Oracle是這個話題的特別野獸。感謝您展示這個例子,就是我今天需要的。 – Marc

+0

像魅力一樣工作。謝謝! –

+0

SQL Server如何修改? – SMKS

相關問題