2011-08-24 23 views
14

me preguntaba si es posible ejecutar múltiples instrucciones sql en 1 go. Por ejemplo el escenario que quiero eliminar filas de varias tablas, ¿hay una manera que puede hacer cosas como ..MyBatis ejecutando múltiples sentencias SQL de una sola vez, ¿es posible?

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

Respuesta

14

Sí, la mayoría de las bases de datos permiten esto. Por lo general, debe delimitar sus declaraciones SQL con algo. En PostGRES y MySQL es un punto y coma (;). En el servidor Microsoft SQL debe usar la palabra clave GO. [Actualización de mayo de 2013: a partir de SQL Server 2012, puede y debe usar punto y coma para delimitar sus declaraciones. Después de SQL Server 2012 (es decir, la próxima versión y más allá), estos serán obligatorios. Usar GO ahora es la forma obsoleta de hacer cosas en SQL2012 y más allá). ]

MySQL/POSTGRES ejemplo: Ejemplo

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} 

Better bases de datos (es decir, no de MySQL.) También apoyarán transacciones con COMENZAR TRAN/COMMIT TRAN/ROLLBACK TRAN . Usando transacciones, puedes agrupar todas las declaraciones en una operación atómica, donde si una parte fallara, las tres se revertirían. Consulte http://www.sqlteam.com/article/introduction-to-transactions para obtener más información sobre estos.

¡Lo más probable es que lo único que necesita son los puntos y comas entre sus declaraciones SQL!

+1

No sé, pero esto no funciona para mí Estoy adjuntando la siguiente GIST https://gist.github.com/AdelinGhanaem/b565ca3a447e89087ab7 se puede ver que no separa los dos estados con 'query' como con rollback ... – Adelin

+2

Intenté de esta manera y myBatis lanzó una excepción. El problema fue que no configuré la bandera allowMultiQueries = true en la URL JDBC. Gracias. –

+0

Esto no funciona para mí también, estoy tratando de eliminar dos lotes de datos a través de la condición 'in', sin embargo, obtuve un error de sintaxis gramatical sql. –

16

Estoy usando myBatis con Oracle. Supongo que hay algo similar en otros DB. En realidad, siempre puedes crear procedimientos en DB, que generalmente es mejor para el futuro, cuando tienes que apoyar el proyecto.

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

Oracle es una bestia especial en este tema. Gracias por mostrar ese ejemplo, justo lo que necesitaba hoy. – Marc

+0

Funcionó como un encanto. ¡Gracias! –

+0

¿Cómo podría modificarse esto para SQL Server? – SMKS

Cuestiones relacionadas