2010-01-13 11 views
5

मैं एक पंक्ति को सम्मिलित करने की कोशिश कर रहा हूं जो पहले से मौजूद हो या न हो। मैं इसे पहले चुनने से बचाना चाहता हूं और/या यदि यह अस्तित्व में है तो -803 प्राप्त करना चाहता हूं। मैंने कुछ शोध किया है और दोनों अनदेखा और मर्ज स्टेटमेंट की कोशिश की है, लेकिन दोनों पर सिंटैक्स त्रुटियां प्राप्त करते रहें। किसी भी मामले में, मैं किसी अन्य तालिका से डेटा की प्रतिलिपि बनाने की कोशिश नहीं कर रहा हूं - इसलिए, विलय वास्तव में उचित नहीं है।
क्या डीबी 2 एसक्यूएल में कोई विफलता-सबूत डालने के लिए कुछ रास्ता नहीं है और इसके आसपास कोड नहीं है? दूसरे शब्दों में, क्या कोई सम्मिलित वाक्यविन्यास है जो गारंटी देता है कि डेटा जोड़ा जाएगा यदि यह अस्तित्व में नहीं है या शून्य स्थिति वापस कर देगा, तो यह भी करता है?डीबी 2 डालने में -803 से बचने की कोशिश

उत्तर

2

संक्षेप में, उत्तर नहीं है। लंबे समय तक, यह सब आपके टेबल पर स्थापित बाधाओं पर निर्भर करता है। यदि आप किसी तालिका के विरुद्ध एक सम्मिलन निष्पादित करने का प्रयास करते हैं जिसमें कॉलम पर एक अद्वितीय बाधा है, और डेटा पहले से मौजूद है जिसे आप सम्मिलित करने का प्रयास कर रहे हैं, तो आपको डीबी 2 (और कोई अन्य आरडीबीएमएस) में एक त्रुटि मिलेगी।

इस मामले में, आपका सबसे अच्छा विकल्प शायद एक संग्रहित प्रक्रिया लिखना है जो यह देखने के लिए जांचता है कि रिकॉर्ड बनाने से पहले रिकॉर्ड पहले से मौजूद है या नहीं।

+2

बेहतर अभी तक: अस्तित्व की जांच करने में समय बर्बाद न करें, संग्रहीत प्रक्रिया सम्मिलित करें, और केवल -803 (SQL0803N) त्रुटि को संभाल लें। यहां तक ​​कि बेहतर: बस एप्लिकेशन को सम्मिलित से वापसी कोड की जांच करें और -803 त्रुटि को संभाल लें। –

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। मैं उम्मीद कर रहा था कि डीबी 2 के पास कुछ अनदेखा "अनदेखा" पैरामीटर था, लेकिन ऐसी कोई किस्मत नहीं थी। माइक –

+0

-803 को संभालने और अद्यतन करने का प्रयास किया, लेकिन यह पूरी प्रक्रिया सफल होने पर भी लॉग में एक स्टैक ट्रेस छोड़ देता है, जिससे दूसरों को प्रश्न पूछने का कारण बनता है।इसलिए, मैं पहले अस्तित्व की जांच करने के लिए कोड बदल रहा हूं। सभी सुझावों के लिए शुक्रिया। –

7

MERGE उचित है, क्योंकि आप गतिशील रूप से उपयोग करने वाले खंड में मूल्यों की आपूर्ति कर सकते हैं (http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/r0010873.htm में उदाहरण 5 देखें)।

लेकिन मेर्ज एक डीबी 2 वी 8.2 सुविधा है! आप शायद वी 8.1 पर हैं, है ना?

आप इस तरह अस्तित्व की जांच लागू करते हैं तो:

SELECT 
if (found) UPDATE else INSERT 

संगामिति मुद्दों से सावधान: दो समवर्ती धागे दोनों कोई स्तंभ मिल सकता है और उसके बाद दोनों भले ही ऊपर कोड के चारों ओर एक लेन-देन है सम्मिलित करने के लिए प्रयास करते हैं,। यह सुनिश्चित करने के लिए, WITH RR USE AND KEEP UPDATE LOCKS का उपयोग करके उपर्युक्त SELECT कथन में रीपेटेबल रीड के साथ आपको अद्यतन लॉक प्राप्त करने की आवश्यकता है।

+0

त्रुटि से फेंकने से रोक दिया जाएगा यदि आप 'INSERT' करते हैं, तो '-803' पकड़ें और फिर 'अद्यतन' करें? –

2

यदि आप 0 परिणाम अपडेट करते हैं तो आप अपडेट स्टेटमेंट कर सकते हैं, फिर सम्मिलित कथन करें।

2

आप sysibm.sysdummy तालिका (या ओरेकल से बेहतर नामित दोहरी या डीबी 2 के बाद के संस्करणों) का उपयोग करके ऐसा कर सकते हैं। यह उस मामले के लिए बहुत अच्छी तरह से काम करेगा जहां आप एक पंक्ति डालना चाहते हैं जो मौजूद नहीं है लेकिन अगर यह मौजूद है तो 0 लौटाएं। AFAIK, आप इस विधि का उपयोग कर एक पंक्ति अद्यतन नहीं कर सकते हैं, आपको इसके लिए विलय का उपयोग करने की आवश्यकता होगी।

ऐसा करने के लिए, आपको अपनी तालिका पर प्राथमिक या अद्वितीय कुंजी की आवश्यकता होगी। आप तालिका में सम्मिलित करते हैं, प्रक्रिया में दोहरी से अपने सभी मानों का चयन करते हैं जहां आपकी प्राथमिक या अद्वितीय अनुक्रमणिका से मेल खाने वाली आपकी तालिका में कोई पंक्ति मौजूद नहीं होती है।

insert into table (column1, column2, column3, column4, column5) 
select 'A', 'B', 'C', 'D', 'E' from dual where not exists (select * from table where column1 = 'A'); 

मैं और जिन मामलों में मैं एक मेज पर डालने कई प्रक्रियाओं के लिए यह बहुत ही उपयोगी पाया है मैं उन आवेषण के आदेश की गारंटी नहीं दे सकते हैं। आप यह पता लगा सकते हैं कि सम्मिलन सफल था या वापसी मूल्य से नहीं था, जो 1 सफल होगा या

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