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), в котором также есть данные.

Почему возникла эта ошибка и как ее можно устранить?

Это было полезно?

Решение

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

Другие советы

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

Как устранить ошибки ORA-30926?(Идентификатор документа 471956.1)

1) Определите ошибочное утверждение

изменить события набора сеансов ‘ошибка имени трассировки 30926, уровень 3 стека ошибок’;

или

изменение событий системного набора ‘ошибка имени трассировки 30926 отключена’;

и следите за файлами .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 (выделено ниже):

ОРА-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.

Эта ошибка возникла у меня из-за повторяющихся записей (16 Кб)

Я попробовал с unique, это сработало .

но снова, когда я попытался объединить без unique, возникла та же проблема Во второй раз это было связано с фиксацией

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top