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



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

1040   5  

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 trace name errorstack level 3';

или

alter system set events '30926 trace name errorstack off';

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

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

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

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

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

3.4) содержит ли оператор несмешиваемое представление в 'In-Subquery'? Это может привести к возвращению повторяющихся строк, если запрос содержит предложение "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 задается после каждой операции слияния.

Comments

    Ничего не найдено.