ORA-30926: स्रोत तालिकाओं में पंक्तियों का एक स्थिर सेट प्राप्त करने में असमर्थ


129

मैं समझ रहा हूं

ORA-30926: स्रोत तालिकाओं में पंक्तियों का एक स्थिर सेट प्राप्त करने में असमर्थ

निम्नलिखित प्रश्न में:

  MERGE INTO table_1 a
      USING 
      (SELECT a.ROWID row_id, 'Y'
              FROM table_1 a ,table_2 b ,table_3 c
              WHERE a.mbr = c.mbr
              AND b.head = c.head
              AND b.type_of_action <> '6') src
              ON ( a.ROWID = src.row_id )
  WHEN MATCHED THEN UPDATE SET in_correct = 'Y';

मैंने भाग लिया है table_1उसके पास डेटा है और मैंने अंदर की क्वेरी ( src) भी चलाई है जिसमें डेटा भी है।

यह त्रुटि क्यों आएगी और इसे कैसे हल किया जा सकता है?

जवाबों:


202

यह आमतौर पर USING क्लॉज में निर्दिष्ट क्वेरी में डुप्लिकेट के कारण होता है। इसका संभवतः अर्थ है कि TABLE_A एक मूल तालिका है और एक ही ROWID को कई बार लौटाया जाता है।

आप अपनी क्वेरी में वास्तव में DISTINCT का उपयोग करके समस्या को हल कर सकते हैं (वास्तव में, यदि 'Y' एक स्थिर मूल्य है तो आपको इसे क्वेरी में डालने की आवश्यकता नहीं है)।

मान लें कि आपकी क्वेरी सही है (अपनी तालिकाओं को न जानें) आप कुछ ऐसा कर सकते हैं:

  MERGE INTO table_1 a
      USING 
      (SELECT distinct ta.ROWID row_id
              FROM table_1 a ,table_2 b ,table_3 c
              WHERE a.mbr = c.mbr
              AND b.head = c.head
              AND b.type_of_action <> '6') src
              ON ( a.ROWID = src.row_id )
  WHEN MATCHED THEN UPDATE SET in_correct = 'Y';

1
संभवत: इसीलिए अन्य दृष्टिकोणों (मेरे लिए) ने भी मेरे लिए अन्य त्रुटियां लौटा दीं (जैसे 'प्रक्रिया, कार्य, पैकेज या प्रकार यहाँ अनुमति नहीं है' और 'स्तंभ को संशोधित नहीं कर सकता जो गैर-कुंजी-संरक्षित तालिका त्रुटि के लिए मैप करते समय कोशिश कर रहा है एक दृश्य में डालें ')। ~ अगर यह किसी और की मदद करता है, तो जब तक मैंने अपने आंतरिक क्वेरी के जोड़ को फिर से व्यवस्थित नहीं किया, तब तक अलग-अलग जोड़ने के बाद भी मुझे वही त्रुटि मिली, इसलिए मैंने उस तालिका के साथ शुरू किया जो एक से अधिक पंक्ति वापस आ रही थी और भीतर से वहां से जुड़ गई ... यदि वह समझ में आता है।
jinglesthula

40

आप संभवतः कई बार लक्ष्य तालिका की एक ही पंक्ति को अपडेट करने का प्रयास कर रहे हैं। मेरे द्वारा विकसित किए गए मर्ज स्टेटमेंट में मुझे बस एक ही समस्या का सामना करना पड़ा। सुनिश्चित करें कि आपका अपडेट मर्ज के निष्पादन में एक से अधिक बार एक ही रिकॉर्ड को नहीं छूता है।


1
+1, धन्यवाद, यह सिर्फ एक छोटी सी डुप्लिकेट (कम से कम मेरिट में उपयोग की जाने वाली चाबियों के आधार पर) के साथ एक लक्ष्य तालिका पर मेरे साथ हुआ।
tbone

6

ORA-30926 त्रुटियों का निवारण कैसे करें? (डॉक आईडी 471956.1)

1) असफल बयान को पहचानें

परिवर्तन सत्र सेट की घटनाएं '30926 ट्रेस नाम त्रुटि स्तर 3';

या

परिवर्तन प्रणाली सेट की घटनाओं '30926 ट्रेस नाम त्रुटि बंद';

और UDUMP में .trc फ़ाइलों के लिए देखें जब यह होता है।

2) एसक्यूएल स्टेटमेंट को प्राप्त करने के बाद, जांचें कि क्या यह सही है (शायद क्वेरी प्लान को जांचने के लिए स्पष्टीकरण योजना या tkprof का उपयोग करके) और संबंधित टेबलों पर आँकड़ों का विश्लेषण या गणना करें यदि यह हाल ही में नहीं किया गया है। पुन: निर्माण (या ड्रॉपिंग / रिक्रूटिंग) इंडेक्स भी मदद कर सकते हैं।

३.१) एसक्यूएल स्टेटमेंट एक MERGE है? यह सुनिश्चित करने के लिए कि डुप्लिकेट में कोई डुप्लिकेट मान नहीं हैं, यह सुनिश्चित करने के लिए USING क्लॉज द्वारा दिए गए डेटा का मूल्यांकन करें। एक निर्धारक को शामिल करने के लिए मर्ज कथन को संशोधित करें जहां खंड

3.2) क्या यह एक दृश्य के माध्यम से अद्यतन है? यदि ऐसा है, तो दृश्य परिणाम को तालिका में बदलने का प्रयास करें और तालिका को सीधे अपडेट करने का प्रयास करें।

3.3) क्या टेबल पर कोई ट्रिगर है? यह देखने के लिए अक्षम करने का प्रयास करें कि क्या यह अभी भी विफल रहता है।

३.४) क्या कथन में 'IN-Subquery' में एक गैर-विलयवादी दृश्य है? इसका परिणाम यह हो सकता है कि डुप्लिकेट पंक्तियों को लौटाया जा सकता है यदि क्वेरी में "FORDATE" खंड है। बग 2681037 देखें

3.5) क्या तालिका में अप्रयुक्त स्तंभ हैं? इन्हें छोड़ने से त्रुटि को रोका जा सकता है।

4) यदि एसक्यूएल को संशोधित करने से त्रुटि ठीक नहीं होती है, तो समस्या तालिका के साथ हो सकती है, खासकर यदि पंक्तिबद्ध पंक्तियाँ हों। 4.1) SQL में प्रयुक्त सभी तालिकाओं पर 'ANALYZE TABLE VALIDATE STRUCTURE CASCADE' कथन को यह देखने के लिए चलाएँ कि क्या तालिका या उसके अनुक्रमणिका में कोई भ्रष्टाचार हैं या नहीं। ४.२) टेबल पर किसी भी CHAINED या माइग्रेटेड ROWS के लिए जाँच करें और समाप्त करें। इसे कम करने के तरीके हैं, जैसे कि PCTFREE की सही सेटिंग। नोट 122020.1 का उपयोग करें - पंक्ति जंजीर और प्रवासन 4.3) यदि तालिका अतिरिक्त रूप से अनुक्रमणित की गई है, तो देखें: नोट 102932.1 - आईओटी पर जंजीर पंक्तियों की निगरानी


5

12 सी पर आज त्रुटि थी और मौजूदा उत्तरों में से कोई भी फिट नहीं है (डुप्लिकेट नहीं है, जहां कोई खंड में कोई गैर-नियतात्मक अभिव्यक्ति नहीं है)। मेरा मामला ओरेकल के संदेश पाठ (नीचे जोर) के अनुसार, त्रुटि के अन्य संभावित कारण से संबंधित था:

ORA-30926: स्रोत तालिकाओं में पंक्तियों का एक स्थिर सेट प्राप्त करने में असमर्थ
कारण: बड़ी dml गतिविधि या एक गैर-नियतात्मक जहाँ खंड के कारण पंक्तियों का एक स्थिर सेट नहीं मिल सका ।

मर्ज एक बड़े बैच का हिस्सा था, और कई समवर्ती उपयोगकर्ताओं के साथ एक लाइव डेटाबेस पर निष्पादित किया गया था। बयान बदलने की कोई जरूरत नहीं थी। मैंने सिर्फ मर्ज से पहले लेनदेन किया, फिर मर्ज अलग से चलाया, और फिर से प्रतिबद्ध किया। इसलिए समाधान संदेश की सुझाई गई कार्रवाई में पाया गया:

क्रिया: किसी भी गैर-नियतात्मक को हटा दें जहां क्लॉस होता है और डीएमएल को फिर से जोड़ता है


मुझे NETWORK_LINKडेटा एकत्र करने के चरण के दौरान नेटवर्क के माध्यम से डेटापम्प आयात ( पैरामीटर का उपयोग जो सीधे स्रोत डेटाबेस से जुड़ता है) कर रहा है, त्रुटि संदेश मिल रहा था और आपका हाइलाइट किया गया नोट संभवतः इसे समझाता है। सौभाग्य से सिर्फ आँकड़े प्रभावित हुए थे।
मार्क स्टीवर्ट

1
SQL Error: ORA-30926: unable to get a stable set of rows in the source tables
30926. 00000 -  "unable to get a stable set of rows in the source tables"
*Cause:    A stable set of rows could not be got because of large dml
           activity or a non-deterministic where clause.
*Action:   Remove any non-deterministic where clauses and reissue the dml.

डुप्लिकेट रिकॉर्ड (16K) के कारण मेरे लिए यह त्रुटि आई

मैंने कोशिश की अद्वितीय के साथ यह काम किया

लेकिन फिर जब मैंने अद्वितीय समान समस्याओं के बिना मर्ज करने की कोशिश की तो दूसरी बार ऐसा हुआ जब यह प्रतिबद्ध था

मर्ज करने के बाद अगर कमिट नहीं किया जाता है तो एरर दिखाया जाएगा।

अद्वितीय के बिना, क्वेरी काम करेगी यदि प्रत्येक मर्ज ऑपरेशन के बाद प्रतिबद्ध दिया गया है।


-1

सामान्य मामले में त्रुटि ORA-30926 को हल करने के लिए DISTINCT के उपयोग के लिए एक और स्पष्टीकरण:

आपको यह सुनिश्चित करने की आवश्यकता है कि USING () क्लॉज द्वारा निर्दिष्ट डेटा के सेट में शामिल कॉलमों का कोई डुप्लिकेट मान नहीं है , यानी ON () क्लॉज में कॉलम

ओपी के उदाहरण में जहां USING क्लॉज केवल एक कुंजी का चयन करता है, यह USIST क्लॉज में DISTINCT को जोड़ने के लिए पर्याप्त था। हालाँकि, सामान्य स्थिति में उपयोग करने के लिए कुंजी स्तंभों के संयोजन को चुन सकते हैं, जो कि यूपीडेट में उपयोग किए जाने वाले स्तंभों और विशेषता स्तंभों से मेल खाते हों ... सेट खंड। इसलिए सामान्य स्थिति में, DISTINCT को USING क्लॉज में जोड़ने पर भी एक ही कुंजी के लिए अलग-अलग अपडेट पंक्तियों की अनुमति मिलेगी, जिस स्थिति में आपको अभी भी ORA-30926 त्रुटि मिलेगी।

यह डीसीयूकी के जवाब और टागर के जवाब में बिंदु 3.1 का एक विस्तार है, जो मेरे अनुभव से तुरंत स्पष्ट नहीं हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.