2011-08-24 8 views
14

मैं सोच रहा था कि 1 एस में एकाधिक एसक्यूएल स्टेटमेंट निष्पादित करना संभव है या नहीं। उदाहरण परिदृश्य है कि मैं कई तालिकाओं से हुई पंक्तियां हटाना चाहते के लिए, वहाँ एक तरह से मैं जैसे काम कर सकें ..MyBatis एक बार में एकाधिक एसक्यूएल स्टेटमेंट निष्पादित करता है, क्या यह संभव है?

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

उत्तर

14

हाँ, सबसे डेटाबेस इसकी अनुमति है। आम तौर पर आपको अपने एसक्यूएल स्टेटमेंट को कुछ के साथ सीमित करना होता है। PostGRES और MySQL में यह अर्धविराम (;) है। माइक्रोसॉफ्ट एसक्यूएल सर्वर में आपको कीवर्ड का उपयोग करना चाहिए। [मई 2013 अद्यतन: एसक्यूएल सर्वर 2012 के रूप में, आप अपने बयान को सीमित करने के लिए अर्धविराम का उपयोग कर सकते हैं और इसका उपयोग करना चाहिए। SQL सर्वर 2012 (यानी अगला संस्करण और उससे परे) के बाद यह अनिवार्य होगा। जीओ का उपयोग अब 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-एसक्यूएल उदाहरण:

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

बेहतर डेटाबेस (यानी नहीं MySQL।) भी शुरू TRAN/COMMIT TRAN/ROLLBACK TRAN के साथ लेनदेन का समर्थन करेंगे । लेन-देन का उपयोग करके आप वास्तव में सभी बयानों को एक परमाणु संचालन में बैच कर सकते हैं, जहां यदि इसका हिस्सा असफल रहा, तो तीनों को वापस ले जाया जाएगा। उन लोगों के बारे में कुछ और जानकारी के लिए http://www.sqlteam.com/article/introduction-to-transactions देखें।

सबसे अधिक संभावना है कि आपको अपने एसक्यूएल स्टेटमेंट्स के बीच अर्धविराम है!

+1

मैं नहीं जानता, लेकिन यह मेरे लिए काम नहीं करता है मैं अगले सार https://gist.github.com/AdelinGhanaem/b565ca3a447e89087ab7 आप देख सकते हैं कि यह साथ दो बयानों को अलग नहीं करता है संलग्न कर रहा हूँ रोलबैक के साथ 'क्वेरी' ... – Adelin

+2

मैंने इस तरह से कोशिश की और MyBatis ने अपवाद फेंक दिया। समस्या यह थी कि मैंने जेडीबीसी यूआरएल में ध्वज अनुमति MultiQueries = सच सेट नहीं किया था। धन्यवाद। –

+0

यह मेरे लिए भी काम नहीं करता है, मैं 'इन' स्थिति के माध्यम से डेटा के दो बैच को हटाने की कोशिश कर रहा हूं, हालांकि मुझे एसक्यूएल व्याकरण वाक्यविन्यास त्रुटि मिली है। –

16

मैं ओरेकल के साथ myBatis का उपयोग कर रहा हूँ। मुझे लगता है कि अन्य डीबी में कुछ समान है। असल में आप हमेशा डीबी में प्रक्रियाएं बना सकते हैं, जो आमतौर पर भविष्य के लिए बेहतर होता है, जब आपको परियोजना का समर्थन करना होता है।

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

ओरेकल इस विषय पर एक विशेष जानवर है। उस उदाहरण को दिखाने के लिए धन्यवाद, बस मुझे आज क्या चाहिए। – Marc

+0

एक आकर्षण की तरह काम किया। धन्यवाद! –

+0

SQL सर्वर के लिए इसे कैसे संशोधित किया जा सकता है? – SMKS

संबंधित मुद्दे