ORA-30926: غير قادر على الحصول على مجموعة مستقرة من الصفوف في جداول المصدر

StackOverflow https://stackoverflow.com/questions/2337271

  •  22-09-2019
  •  | 
  •  

سؤال

تلقيت

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) التي لديها أيضا البيانات.

لماذا يأتي هذا الخطأ وكيف يمكن حله؟

هل كانت مفيدة؟

المحلول

عادة ما يحدث هذا بسبب التكرارات في الاستعلام المحدد في استخدام البند. ربما يعني هذا أن Table_A هو جدول الأصل ويتم إرجاع نفس Rowid عدة مرات.

يمكنك حل المشكلة بسرعة باستخدام جهاز استفسار متميز (في الواقع ، إذا كانت "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';

نصائح أخرى

ربما تحاول تحديث نفس الصف من الجدول المستهدف عدة مرات. لقد واجهت نفس المشكلة في بيان دمج قمت بتطويره. تأكد من أن التحديث الخاص بك لا يلمس نفس السجل أكثر من مرة في تنفيذ الدمج.

كيفية استكشاف أخطاء ORA-30926؟ (DOC ID 471956.1)

1) تحديد البيان الفاشل

ALTER ALTER SESSION SET EVENTS '30926 TRACE NAME ERRORSTACK LEVEL 3' ؛

أو

Alter System Set Events '30926 Trace Name errorstack Off "؛

وشاهد ملفات .trc في UDUMP عند حدوثها.

2) بعد العثور على عبارة SQL ، تحقق مما إذا كان صحيحًا (ربما باستخدام الخطة الشرح أو TKPROF للتحقق من خطة تنفيذ الاستعلام) وتحليل أو حساب الإحصائيات على الجداول المعنية إذا لم يتم ذلك مؤخرًا. قد تساعد فهارس إعادة بناء (أو إسقاط/إعادة إنشاء) أيضًا.

3.1) هل بيان SQL دمج؟ قم بتقييم البيانات التي يتم إرجاعها بواسطة جملة استخدام لضمان عدم وجود قيم مكررة في Join. قم بتعديل بيان الدمج لتضمين شرط حتمي

3.2) هل هذا عبارة تحديث عبر طريقة عرض؟ إذا كان الأمر كذلك ، فحاول ملء نتيجة العرض في جدول وحاول تحديث الجدول مباشرة.

3.3) هل هناك مشغل على الطاولة؟ حاول تعطيلها لمعرفة ما إذا كان لا يزال يفشل.

3.4) هل يحتوي العبارة على رؤية غير قابلة للتقدم في "في المخطط"؟ يمكن أن يؤدي ذلك إلى إرجاع صفوف مكررة إذا كان للاستعلام جملة "للتحديث". انظر الخطأ 2681037

3.5) هل يحتوي الجدول على أعمدة غير مستخدمة؟ إسقاط هذه قد يمنع الخطأ.

4) إذا لم يعالج تعديل SQL الخطأ ، فقد تكون المشكلة مع الجدول ، خاصة إذا كانت هناك صفوف متسلسلة. 4.1) قم بتشغيل عبارة "تحليل الجدول التحقق من صحة بنية Cascade" على جميع الجداول المستخدمة في SQL لمعرفة ما إذا كان هناك أي فساد في الجدول أو فهارسه. 4.2) تحقق من أي صفوف متسلسلة أو تم ترحيلها على الطاولة والقضاء عليها. هناك طرق لتقليل ذلك ، مثل الإعداد الصحيح لـ PCTFree. استخدم الملاحظة 122020.1 - صفوف الصفوف والترحيل 4.3) إذا تم تنظيم الجدول بالإضافة إلى ذلك ، انظر: الملاحظة 102932.1 - مراقبة صفوف متسلسلة على IOTS

كان هناك خطأ اليوم على 12C ولا تتناسب أي من الإجابات الحالية (لا توجد تكرارات ، ولا تعبيرات غير محددة في الفقرة). كانت حالتي مرتبطة بهذا السبب الآخر المحتمل للخطأ ، وفقًا لنص رسالة Oracle (التأكيد أدناه):

ORA-30926: غير قادر على الحصول على مجموعة مستقرة من الصفوف في جداول المصدر
السبب: لا يمكن الحصول على مجموعة مستقرة من الصفوف بسبب نشاط DML كبير أو غير حتمي حيث بند.

كان الدمج جزءًا من دفعة أكبر ، وتم تنفيذه على قاعدة بيانات حية مع العديد من المستخدمين المتزامنين. لم تكن هناك حاجة لتغيير البيان. لقد ارتكبت المعاملة قبل الدمج ، ثم ركضت الاندماج بشكل منفصل ، وارتكبت مرة أخرى. لذلك تم العثور على الحل في الإجراء المقترح للرسالة:

الإجراء: قم بإزالة أي جمل غير حتمية و إعادة إصدار DML.

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)

أنا حاولت مع فريدة من نوعها تعمل .

ولكن مرة أخرى عندما حاولت الدمج دون أن حدث فريد من نوعه حدث للمرة الثانية ، كان من المقرر الالتزام

بعد الاندماج إذا لم يتم الالتزام بأنه سيتم عرض نفس الخطأ.

بدون فريدة من نوعها ، سيعمل الاستعلام إذا تم تقديم الالتزام بعد كل عملية دمج.

توضيح إضافي لاستخدام خطأ في حل ORA-30926 في الحالة العامة:

تحتاج إلى التأكد من أن مجموعة البيانات المحددة بواسطة شرط استخدام () لا تحتوي على قيم مكررة لـ انضم إلى الأعمدة, ، أي الأعمدة في شرط ON ().

في مثال OP ، حيث تحدد شرط استخدام المفتاح فقط ، كان يكفي إضافة مميزة إلى الفقرة باستخدام. ومع ذلك ، في الحالة العامة ، يجوز للفقرة التي تستخدم استخدام مجموعة من أعمدة المفاتيح لتتطابق مع الأعمدة المراد استخدامها في التحديث ... SET CHOLAUSE. لذلك في الحالة العامة ، ستظل إضافة متميزة إلى الفقرة استخدام صفوف تحديث مختلفة لنفس المفاتيح ، وفي هذه الحالة ستظل تحصل على خطأ ORA-30926.

هذا هو تفصيل لإجابة Dcookie والنقطة 3.1 في إجابة Tagar ، والتي قد لا تكون من تجربتي واضحة على الفور.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top