2011-08-24 9 views
14

Mi chiedevo se è possibile eseguire più istruzioni SQL in 1 go. Ad esempio lo scenario che voglio eliminare righe da più tabelle, c'è un modo che io possa fare le cose come ..MyBatis esegue più istruzioni SQL in un colpo solo, è possibile?

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

risposta

14

Sì, la maggior parte dei database permettono questo. Di solito devi delimitare le tue istruzioni SQL con qualcosa. In PostGRES e MySQL è un punto e virgola (;). Nel server Microsoft SQL è necessario utilizzare la parola chiave GO. [Aggiornamento di maggio 2013: a partire da SQL Server 2012, è possibile e dovrebbe utilizzare il punto e virgola per delimitare le proprie istruzioni. Dopo SQL Server 2012 (vale a dire la prossima versione e oltre) questi saranno obbligatori. L'utilizzo di GO è ora il modo deprecato di fare cose in SQL2012 e oltre). ]

MySQL/Postgres esempio:

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

MS-SQL Esempio:

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

Meglio database (cioè non MySQL.) Sosterrà anche le operazioni con BEGIN TRAN/commit TRAN/ROLLBACK TRAN . Usando le transazioni puoi effettivamente raggruppare tutte le istruzioni in un'unica operazione atomica, dove se una parte di essa fallisse, tutte e tre verrebbero ripristinate. Vedi http://www.sqlteam.com/article/introduction-to-transactions per ulteriori informazioni su quelli.

Molto probabilmente tutto ciò che serve è il punto e virgola tra le istruzioni SQL però!

+1

Non so, ma questo non funziona per me Vi allego la prossima Gist https://gist.github.com/AdelinGhanaem/b565ca3a447e89087ab7 si può vedere che non separa le due affermazioni con 'query' come con rollback ... – Adelin

+2

Ho provato in questo modo e myBatis ha generato un'eccezione. Il problema era che non ho impostato il flag allowMultiQueries = true nell'URL JDBC. Grazie. –

+0

Questo non funziona anche per me, sto cercando di eliminare due batch di dati tramite la condizione 'in', tuttavia ho ottenuto l'errore di sintassi della grammatica sql. –

16

Sto usando myBatis con Oracle. Immagino ci sia qualcosa di simile in altri DB. In realtà puoi sempre creare procedure in DB, che di solito è meglio per il futuro, quando devi supportare il progetto.

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

Oracle è una bestia speciale su questo argomento. Grazie per aver mostrato quell'esempio, proprio quello di cui avevo bisogno oggi. – Marc

+0

Ha funzionato come un fascino. Grazie! –

+0

Come potrebbe essere modificato per SQL Server? – SMKS

Problemi correlati