ORA-30926: невозможно получить стабильный набор строк в исходных таблицах

Я

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), который также имеет данных.

почему эта ошибка пришла и как она может быть решена?

5 ответов


обычно это вызвано дубликатами в запросе, указанном в предложении 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';

вы, вероятно, пытаетесь обновить одну и ту же строку целевой таблицы несколько раз. Я только что столкнулся с той же проблемой в инструкции merge, которую я разработал. Убедитесь, что обновление не трогать одну и ту же запись более одного раза при выполнении слияния.


Как устранить ошибки ORA-30926? (Doc ID 471956.1)

1) Определите оператор failing

alter session set events ‘30926 имя трассировки errorstack Уровень 3';

или

alter system set events '30926 имя трассировки errorstack off';

и наблюдать за .trc файлы в UDUMP, когда это происходит.

2) найдя инструкцию SQL, проверьте ее правильность (возможно, с помощью explain plan или tkprof для проверки плана выполнения запроса) и анализа или вычисления статистики по соответствующим таблицам, если это не было сделано в последнее время. Перестроение (или удаление/воссоздание) индексов также может помочь.

3.1) является ли оператор SQL слиянием? оцените данные, возвращаемые предложением USING, чтобы убедиться, что в соединении нет повторяющихся значений. Измените оператор merge, чтобы включить детерминированное предложение where

3.2) это обновление заявление через вид? Если это так, попробуйте заполнить результат представления в таблицу и попробуйте обновить таблицу напрямую.

3.3) есть ли триггер на столе? Попробуйте отключить его, чтобы увидеть, если он все еще терпит неудачу.

3.4) содержит ли оператор неразъемное представление в "вложенном запросе"? Это может привести к возвращению повторяющихся строк, если запрос имеет предложение "FOR UPDATE". Увидеть 2681037 Ошибка

3.5) имеет ли таблица неиспользуемые столбцы? Падение этих может предотвратить ошибка.

4) Если изменение SQL не устраняет ошибку, проблема может быть с таблицей, особенно если есть цепные строки. 4.1) запустите инструкцию "ANALYZE TABLE VALIDATE STRUCTURE CASCADE" для всех таблиц, используемых в SQL, чтобы увидеть, есть ли какие-либо повреждения в таблице или ее индексах. 4.2) проверьте и устраните все связанные или перенесенные строки в таблице. Есть способы минимизировать это, например, правильная настройка PCTFREE. Использовать Примечание 122020.1-цепочка строк и Миграция 4.3) если таблица дополнительно организована по индексу, см.: Примечание 102932.1-мониторинг цепных строк в IOTs


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

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

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

действие: удалите любые недетерминированные предложения where и переиздать 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)

Я пробовал с уникальным он работал .

но снова, когда я попытался объединить без уникального же proble произошло Во второй раз он должен был совершить

после слияния, если фиксация не выполнена, будет показана та же ошибка.

без unique запрос будет работать, если commit задается после каждой операции слияния.