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 рівень ідентифікації помилок імені треку";

або

змінити події системи набору "вимкнено помилку стеження імені 30926 імені треку";

і спостерігати за .trc файлами в UDUMP, коли це відбувається.

2) Знайшовши оператор SQL, перевірте, чи він правильний (можливо, використовуйте план роз'яснення або tkprof для перевірки плану виконання запиту) та проаналізуйте або обчисліть статистику для відповідних таблиць, якщо цього нещодавно не було зроблено. Перебудова (або відмова / відтворення) індексів може також допомогти.

3.1) Чи є оператор SQL МЕРГ? оцінити дані, повернені пунктом USING, щоб упевнитись, що у з'єднанні немає повторюваних значень. Змініть оператор злиття, щоб включити детермінований де пункт

3.2) Це твердження UPDATE через перегляд? Якщо так, спробуйте заповнити результат перегляду в таблицю і спробуйте оновити таблицю безпосередньо.

3.3) Чи є тригер на столі? Спробуйте відключити його, щоб побачити, чи все ще не працює.

3.4) Чи містить виписка непередаваемое представлення у "IN-Subquery"? Це може призвести до повернення дублюючих рядків, якщо в запиті є пункт "ЗА ОНОВЛЕННЯ". Див. Bug 2681037

3.5) Чи є у таблиці невикористані стовпці? Видалення цих даних може запобігти помилці.

4) Якщо зміна SQL не усуває помилку, проблема може виникнути з таблицею, особливо якщо є прикуті рядки. 4.1) Запустіть оператор "ANALYZE TABLE VALIDATE STRIDT STRUCTURE CASCADE" на всіх таблицях, що використовуються в SQL, щоб побачити, чи є пошкодження в таблиці або її індексах. 4.2) Перевірте та усуньте будь-які ЗАСВЯЗАНІ або перенесені ROWS на столі. Існують способи мінімізувати це, наприклад, правильна настройка PCTFREE. Використовуйте примітку 122020.1 - ланцюжок рядків та міграцію 4.3) Якщо таблиця додатково організована індексами, див .: Примітка 102932.1 - Моніторинг ланцюгових рядків на IOT


5

Якщо помилка сьогодні на 12c, і жодна з існуючих відповідей не підходила (жодних дублікатів, недетермінованих виразів у пункті WHERE). Мій випадок був пов'язаний з тією іншою можливою причиною помилки, відповідно до тексту повідомлення Oracle (акцент нижче):

ORA-30926: неможливо отримати стабільний набір рядків у вихідних таблицях
Причина: Стабільний набір рядків не вдалося отримати через велику активність dml або недетермінований пункт, де.

Злиття було частиною більшої партії і виконувалось на базі даних в реальному часі з багатьма одночасними користувачами. Не потрібно було змінювати заяву. Я просто здійснив транзакцію до злиття, потім запустив об'єднання окремо і знову здійснив. Тож рішення було знайдено в запропонованій дії повідомлення:

Дія: Видаліть будь-які недетерміновані деклаументи та перезапустіть dml .


Я отримував це повідомлення про помилку, здійснюючи імпорт DataPump через мережу (використовуючи 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

Подальше уточнення щодо використання DISTINCT для усунення помилки ORA-30926 у загальному випадку:

Вам потрібно переконатися, що набір даних, визначений пунктом USING (), не має дублюючих значень стовпців приєднання , тобто стовпців у пункті ON () .

У прикладі OP, коли пункт USING вибирає лише ключ, було достатньо додати DISTINCT до пункту USING. Однак у загальному випадку пункт USING може вибрати комбінацію стовпців клавіш, щоб відповідати стовпцям та атрибутам, які будуть використані у пункті UPDATE ... SET. Тому в загальному випадку додавання DISTINCT до пункту USING все одно дозволить отримувати різні рядки оновлення для одних і тих же ключів, і в цьому випадку ви все одно отримаєте помилку ORA-30926.

Це розробка відповіді DCookie і пункту 3.1 у відповіді Тагара, що, з мого досвіду, може бути не відразу очевидним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.