2011-08-24 15 views
14

1 seferde birden çok sql ifadesinin yürütülmesinin mümkün olup olmadığını merak ediyorum. Örneğin ben birden çok tablodan satırları silmek istediğiniz senaryo için,MyBatis tek seferde birden çok sql deyimi yürütme, bu mümkün mü?

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

cevap

14

Evet, çoğu veritabanları buna izin i gibi şeyler yapabiliriz bir yol .. yoktur. Genellikle SQL ifadelerinizi bir şeyle sınırlandırmanız gerekir. PostGRES ve MySQL'de bir noktalı virgül (;). Microsoft SQL sunucusunda GO anahtar sözcüğünü kullanmalısınız. [Mayıs 2013 Güncelleme: SQL Server 2012'den itibaren, ifadelerinizi sınırlamak için noktalı virgül kullanabilirsiniz ve kullanmalısınız. SQL Server 2012'den sonra (yani sonraki sürüm ve ötesi) bunlar zorunlu olacaktır. GO kullanmak, SQL2012 ve ötesindeki işleri yapmak için artık kullanılmayan bir yoldur. ]

MySQL/PostgreS örnek:

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

MS-SQL örnek: Ayrıca TRAN/ROLLBACK TRAN COMMIT/TRAN BEGIN ile işlemleri destekleyecek

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

Daha iyi veritabanları (yani değil MySQL.) . İşlemleri kullanarak, tüm ifadeleri tek atomlu bir işlemle gruplayabilirsiniz, burada bir kısmı başarısız olursa, üçü de geri alınır. Bunlar hakkında daha fazla bilgi için bkz. http://www.sqlteam.com/article/introduction-to-transactions.

Büyük olasılıkla ihtiyacınız olan tüm SQL deyimleri arasındaki noktalı virgül olsa!

+1

Bilmiyorum ama bu onu iki ifadeleri ayırmak olmadığını görebilirsiniz sonraki özünü https://gist.github.com/AdelinGhanaem/b565ca3a447e89087ab7 bağlama am benim için çalışmıyor rollback ile 'sorgu' ... – Adelin

+2

Bu yolu denedim ve myBatis bir istisna attı. Sorun, JDBC URL'sinde flag allowMultiQueries = true ayarlamamdı. Teşekkürler. –

+0

Bu benim için de işe yaramıyor, ben 'in' durumu ile iki toplu veri silmeye çalışıyorum, ancak sql dilbilgisi sözdizimi hatası var. –

16

Oracle ile myBatis kullanıyorum. Sanırım başka bir DB'de benzer bir şey var. Aslında, projeyi desteklemeniz gerektiğinde, genellikle geleceğe yönelik olan DB'de her zaman prosedürler oluşturabilirsiniz.

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

Oracle bu konudaki özel bir canavardır. Bu örneği gösterdiğiniz için teşekkürler, sadece bugün ihtiyacım olan şey. – Marc

+0

Bir çekicilik gibi çalıştım. Teşekkürler! –

+0

Bu, SQL Server için nasıl değiştirilebilir? – SMKS

İlgili konular