Я получаю
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? (Doc ID 471956.1)
alter session set events '30926 trace name errorstack level 3';
или
alter system set events '30926 trace name errorstack off';
и следите за файлами .trc в UDUMP, когда это происходит.
3.1) Является ли SQL-оператор MERGE? Оцените данные, возвращаемые предложением USING, чтобы убедиться, что в объединении нет дубликатов значений. Измените оператор слияния, включив в него детерминированное предложение where
3.2) Это оператор UPDATE через представление? Если да, попробуйте поместить результат представления в таблицу и попробуйте обновить таблицу напрямую.
3.3) Есть ли триггер на таблице? Попробуйте отключить его и посмотреть, не произойдет ли сбой.
3.4) Содержит ли оператор не объединяемое представление в 'IN-Subquery'? Это может привести к возврату дублирующихся строк, если в запросе есть пункт "FOR UPDATE". См. ошибку 2681037
3.5) Есть ли в таблице неиспользуемые столбцы? Их удаление может предотвратить ошибку.
Сегодня ошибка на 12В и ни один из существующих ответов подходят (нет дублей, нет недетерминированные выражения в предложении where). Мое дело было связано с, что другие возможные причины ошибки, по данным Oracle'текст сообщения (выделено ниже):
в Ora-30926: невозможно получить устойчивый набор строк в исходных таблицах Причина: устойчивый набор строк не смог завестись из-за больших операций DML или недетерминированные предложения where.
Слияние является частью более крупной партии, и был казнен на живой базе с множеством одновременных пользователей. Нет необходимости менять заявление. Я только что совершил сделку до слияния, затем побежал сливать отдельно, и снова совершил. Поэтому было найдено решение в предложенных действий сообщение:
и GT; действие: удалить любой недетерминированный, где п. и повторите дмл.
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К)
Я попробовал с уникальными он работал .
но опять же, когда я пытался слиться без уникальных же проблема произошла Второй раз это произошло из-за фиксации
после слияния, если обязательство не делать же ошибки будут показаны.
Без уникального, запрос будет работать, если коммит после каждой операции слияния.
Дальнейшее разъяснение с использованием различных по урегулированию ошибка Ora-30926 в общем случае:<п> Вы должны убедиться, что набор данных, указанный с помощью() предложение не дублировать значения <б>присоединяйтесь колонны</б>, Т. е. <б>столбцы в() п.</б>.<п> В ОП'ы например, где через предложение выбирает только ключ, достаточно добавить distinct в предложении using. Однако, в общем случае, используя пункт может выбрать комбинацию ключевых столбцов для сопоставления и атрибутов столбцов, которые будут использованы в обновлении ... установить предложение. Поэтому в общем случае, добавляя местный колорит, используя положение будет по-прежнему позволяют разные строки обновление по той же клавиши, в этом случае вы все равно получите на Ora-30926 ошибка.<п> Это разработка DCookie'ы ответ и пункт 3.1 в Тагар'ы ответьте, что из моего опыта может быть очевиден не сразу.