Невозможно получить устойчивый набор строк в исходных таблицах oracle
Я запускал table_1 его с данными, а также я запускал внутренний запрос ( src ), который также имеет данные.
Почему возникла эта ошибка и как ее решить?
Обычно это вызвано дублированием в запросе, указанном в предложении USING. Это, вероятно, означает, что TABLE_A является родительской таблицей и один и тот же ROWID возвращается несколько раз.
Вы можете быстро решить проблему, используя DISTINCT в своем запросе (фактически, если «Y» - постоянное значение, вам даже не нужно помещать его в запрос).
Предполагая, что ваш запрос правильный (вы не знаете свои таблицы), вы можете сделать что-то вроде этого:
Вероятно, поэтому другие подходы (для меня) также вернули мне другие ошибки (например, «процедура, функция, пакет или тип здесь не разрешены» и «Невозможно изменить столбец, который сопоставляется с ошибкой таблицы без сохранения ключа при попытке вставить в представление ').Если это помогает кому-то еще, я получал ту же ошибку даже после добавления отдельного в, пока я не перестроил свои соединения внутреннего запроса, поэтому я начал с таблицы, которая возвращала более одной строки и внутреннее объединение оттуда . если это имеет смысл.
Вероятно, вы пытаетесь обновить одну и ту же строку целевой таблицы несколько раз. Я только что столкнулся с той же проблемой в разработанном мной операторе слияния. Убедитесь, что ваше обновление не затрагивает одну и ту же запись более одного раза при выполнении слияния.
+1, спасибо, это случилось со мной на целевой таблице с небольшим количеством дубликатов (по крайней мере, на основе ключей, используемых при слиянии).Как устранить ошибки ORA-30926? (ID документа 471956.1)
1) Определите ошибочное утверждение
изменить события набора сеансов '30926 имя трассировки errorstack level 3';
изменить системные события '30926 имя трассировки errorstack off';
и следите за файлами .trc в UDUMP, когда это происходит.
2) Найдя оператор SQL, проверьте его правильность (возможно, используя план объяснения или tkprof для проверки плана выполнения запроса) и проанализируйте или вычислите статистику по соответствующим таблицам, если это не было сделано в последнее время. Также может помочь восстановление (или удаление / воссоздание) индексов.
3.1) Является ли оператор SQL MERGE? оцените данные, возвращаемые предложением USING, чтобы убедиться, что в объединении нет повторяющихся значений. Измените оператор слияния, чтобы включить детерминированное предложение where
3.2) Это оператор UPDATE через представление? Если да, попробуйте заполнить результат просмотра в таблице и попробуйте обновить таблицу напрямую.
3.3) Есть ли на столе триггер? Попробуйте отключить его, чтобы проверить, не работает ли он по-прежнему.
3.4) Содержит ли оператор представление, не допускающее слияния, во 'IN-подзапросе'? Это может привести к возврату повторяющихся строк, если в запросе есть предложение FOR UPDATE. См. Ошибку 2681037
3.5) Есть ли в таблице неиспользуемые столбцы? Их удаление может предотвратить ошибку.
4) Если изменение SQL не устраняет ошибку, проблема может заключаться в таблице, особенно если есть связанные строки. 4.1) Запустите оператор ANALYZE TABLE VALIDATE STRUCTURE CASCADE для всех таблиц, используемых в SQL, чтобы увидеть, есть ли какие-либо повреждения в таблице или ее индексах. 4.2) Проверьте и удалите все СВЯЗАННЫЕ или перенесенные СТРОКИ в таблице. Есть способы минимизировать это, например, правильная установка PCTFREE. Используйте примечание 122020.1 - Сцепление строк и миграция 4.3) Если таблица дополнительно упорядочена по индексу, см .: Примечание 102932.1 - Мониторинг связанных строк в IOT
Я запустил table_1 , у него есть данные, а также я выполнил внутренний запрос ( src ), который также имеет данные.
Почему возникла эта ошибка и как она может быть решена?
ОТВЕТЫ
Ответ 1
Это обычно вызвано дубликатами в запросе, указанном в предложении USING. Вероятно, это означает, что TABLE_A является родительской таблицей, и один и тот же ROWID возвращается несколько раз.
Вы можете быстро решить проблему, используя DISTINCT в своем запросе (фактически, если "Y" - это постоянное значение, которое вам даже не нужно помещать в запрос).
Предполагая, что ваш запрос верен (не знаете ваши таблицы), вы можете сделать что-то вроде этого:
Ответ 2
Вероятно, вы пытаетесь несколько раз обновлять одну и ту же строку целевой таблицы. Я просто столкнулся с той же проблемой в выражении слияния, которое я разработал. Убедитесь, что ваше обновление не затрагивает одну и ту же запись более одного раза при выполнении слияния.
Ответ 3
ORA-30926: невозможно получить стабильный набор строк в исходных таблицах
Причина. Устойчивый набор строк не может быть получен из-за большой активности dml или неопределенного предложения where.
Действие: удалите любые недетерминированные предложения where и переиздайте dml.
Ответ 4
Как устранить ошибки ORA-30926? (Doc ID 471956.1)
1) Определите утверждение об ошибке
изменить события набора сеансов '30926 уровень ошибки имени трещины 3;
изменить события системного набора "30926 trace name errorstack off;
и наблюдайте за .trc файлами в UDUMP, когда это происходит.
2) Найдя инструкцию SQL, проверьте, правильно ли она (возможно, с помощью плана объяснения или tkprof, чтобы проверить план выполнения запроса) и проанализируйте или вычислите статистику по соответствующим таблицам, если это не было сделано в последнее время. Также могут помочь перестроение (или падение/воссоздание) индексов.
3.1) Является ли оператор SQL MERGE? оцените данные, возвращаемые предложением USING, чтобы убедиться, что в объединении нет повторяющихся значений. Измените оператор слияния, чтобы включить детерминированное предложение where
3.2) Является ли это оператором UPDATE через представление? Если это так, попробуйте заполнить результат просмотра в таблицу и попробуйте обновить таблицу напрямую.
3.3) Есть ли триггер на столе? Попробуйте отключить его, чтобы убедиться, что он все еще не работает.
3.4). Содержит ли оператор неизмеримое представление в "IN-Subquery"? Это может привести к возврату повторяющихся строк, если запрос имеет предложение "FOR UPDATE". См. Bug 2681037
3.5) Имеются ли в таблице неиспользуемые столбцы? Удаление этих данных может помешать ошибке.
4) Если модификация SQL не устраняет ошибку, проблема может быть связана с таблицей, особенно если есть цепочка строк. 4.1) Запустите оператор "АНАЛИЗ ТАБЛИЦЫ VALIDATE STRUCTURE CASCADE" во всех таблицах, используемых в SQL, чтобы увидеть, есть ли какие-либо повреждения в таблице или ее индексах. 4.2) Проверяйте и удаляйте любые CHAINED или migrated ROWS на столе. Есть способы минимизировать это, например, правильную настройку PCTFREE. Использовать примечание 122020.1 - цепочка строк и миграция 4.3) Если таблица дополнительно указана в разделе "Упорядочено", см. Примечание 102932.1 - Мониторинг цепочек строк в IOT
Я побежал table_1 Он имеет данные, а также я запустил внутренний запрос ( src ), который также имеет данных.
почему эта ошибка пришла и как она может быть решена?
обычно это вызвано дубликатами в запросе, указанном в предложении USING. Это, вероятно, означает, что TABLE_A является родительской таблицей, и один и тот же ROWID возвращается несколько раз.
вы можете быстро решить проблему, используя DISTINCT в своем запросе (на самом деле, если " 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
ORA-30926: невозможно получить стабильный набор строк в исходных таблицах
Причина: не удалось получить стабильный набор строк из-за большой активности dml или недетерминированный, где пункт.
действие: удалите любые недетерминированные предложения where и переиздать dml.
эта ошибка произошла для меня из-за повторяющихся записей (16K)
Я пробовал с уникальным он работал .
но снова, когда я попытался объединить без уникального же proble произошло Во второй раз он должен был совершить
после слияния, если фиксация не выполнена, будет показана та же ошибка.
без unique запрос будет работать, если commit задается после каждой операции слияния.
Я запустил table_1 , у него есть данные, а также я выполнил внутренний запрос ( src ), который также содержит данные.
Почему возникла эта ошибка и как ее решить?
Обычно это вызвано дублированием в запросе, указанном в предложении USING. Это, вероятно, означает, что TABLE_A является родительской таблицей и один и тот же ROWID возвращается несколько раз.
Вы можете быстро решить проблему, используя DISTINCT в своем запросе (фактически, если «Y» - постоянное значение, вам даже не нужно вводить его в запрос).
Предполагая, что ваш запрос правильный (вы не знаете свои таблицы), вы можете сделать что-то вроде этого:
Вероятно, вы пытаетесь обновить одну и ту же строку целевой таблицы несколько раз. Я только что столкнулся с той же проблемой в разработанном мной операторе слияния. Убедитесь, что ваше обновление не касается одной и той же записи более одного раза при выполнении слияния.
Как устранить ошибки ORA-30926? (ID документа 471956.1)
1) Определите ошибочное утверждение
изменить события набора сеансов «30926 имя трассировки, уровень ошибки, стек 3»;
изменить системные события «30926 имя трассировки errorstack off»;
И следите за файлами .trc в UDUMP, когда это происходит.
2) Найдя оператор SQL, проверьте его правильность (возможно, с помощью плана объяснения или tkprof для проверки плана выполнения запроса) и проанализируйте или вычислите статистику по соответствующим таблицам, если это не было сделано в последнее время. Также может помочь восстановление (или удаление / воссоздание) индексов.
3.1) Является ли оператор SQL MERGE? оцените данные, возвращаемые предложением USING, чтобы убедиться, что в объединении нет повторяющихся значений. Измените оператор слияния, чтобы включить детерминированное предложение where
3.2) Это оператор UPDATE через представление? Если да, попробуйте заполнить результат представления в таблице и попробуйте обновить таблицу напрямую.
3.3) Есть ли на столе триггер? Попробуйте отключить его, чтобы проверить, не работает ли он по-прежнему.
3.4) Содержит ли оператор представление, не допускающее слияния, во 'IN-подзапросе'? Это может привести к возврату повторяющихся строк, если в запросе есть предложение FOR UPDATE. См. Ошибку 2681037
3.5) Есть ли в таблице неиспользуемые столбцы? Их удаление может предотвратить ошибку.
4) Если изменение SQL не устраняет ошибку, проблема может заключаться в таблице, особенно если есть связанные строки. 4.1) Запустите оператор «ANALYZE TABLE VALIDATE STRUCTURE CASCADE» для всех таблиц, используемых в SQL, чтобы увидеть, есть ли какие-либо повреждения в таблице или ее индексах. 4.2) Проверьте и удалите все СВЯЗАННЫЕ или перенесенные СТРОКИ в таблице. Есть способы минимизировать это, например, правильная установка PCTFREE. Используйте примечание 122020.1 - Сцепление строк и миграция 4.3) Если таблица дополнительно индексируется, см .: Примечание 102932.1 - Мониторинг связанных строк в IOT
ORA-30926: невозможно получить стабильный набор строк в исходных таблицах
Причина: не удалось получить стабильный набор строк из-за большой активности dml или недетерминированного предложения where.
Действие: удалите все недетерминированные предложения where и повторно введите dml .
Дальнейшее пояснение использования DISTINCT для устранения ошибки ORA-30926 в общем случае:
Вам необходимо убедиться, что набор данных, указанный в предложении USING (), не имеет повторяющихся значений столбцов соединения , то есть столбцов в предложении ON () .
В примере OP, где предложение USING выбирает только ключ, было достаточно добавить DISTINCT к предложению USING. Однако в общем случае предложение USING может выбрать комбинацию ключевых столбцов для сопоставления и столбцов атрибутов, которые будут использоваться в предложении UPDATE . SET. Таким образом, в общем случае добавление DISTINCT к предложению USING по-прежнему позволяет обновлять разные строки для одних и тех же ключей, и в этом случае вы все равно получите ошибку ORA-30926.
Это разработка ответа DCookie и пункта 3.1 в ответе Тагара, который, по моему опыту, может быть не сразу очевиден.
Эта ошибка возникла у меня из-за повторяющихся записей (16 КБ)
Я пробовал с уникальным, это сработало .
Но снова, когда я попытался выполнить слияние без уникальной такой же проблемы, произошел второй раз, это было связано с фиксацией
после слияния, если фиксация не выполнена, будет показана та же ошибка.
Без уникальности Query будет работать, если после каждой операции слияния выполняется фиксация.
Я не смог решить эту проблему через несколько часов. В конце концов я просто сделал выбор из двух объединенных таблиц, создал извлечение и создал отдельные операторы обновления SQL для 500 строк в таблице. Уродливо, но лучше тратить часы на то, чтобы заставить запрос работать.
Читайте также: