2010-02-25 1 views
94

Я получаю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), который также имеет данные.

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

ответ

145

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

10x Хороший ответ. Это помогло мне –

+0

От меня тоже .. прямо на голове – TonyP

+1

Возможно, поэтому другие подходы (для меня) также вернули мне другие ошибки (например, «процедура, функция, пакет или тип не разрешены здесь» и «Невозможно изменить столбец, который сопоставляется с ошибкой таблицы, не содержащей ключа, при попытке вставить в представление '). ~Если это помогает кому-то еще, я получил ту же ошибку, даже после добавления отличия до тех пор, пока я не перестроил соединения моего внутреннего запроса, поэтому я начал с таблицы, которая получала больше одной строки, возвращенной, и внутреннее соединение оттуда ... если это имеет смысл. – jinglesthula

33

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

+0

+1, спасибо, это только что произошло со мной на целевой таблице с небольшим количеством дубликатов (по крайней мере, на основе ключей, используемых в слиянии). – tbone

2

как устранить неисправность ORA-30926 ошибки? (Doc ID 471956,1)

1) Определить неисправную заявление

альтер набор сессии «30926 след уровня название errorstack 3» событий;

или

альтер система устанавливать события «имя 30926 след errorstack от»;

и следить за .trc-файлами в UDUMP, когда это происходит.

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

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

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

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

3.4) Является ли утверждение содержащим неизмеримое представление в «IN-Subquery»? Это может привести к возврату повторяющихся строк, если запрос имеет предложение «FOR UPDATE». См. Bug 2681037

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

4) Если модификация SQL не устраняет ошибку, проблема может быть связана с таблицей, особенно если есть цепочка строк. 4.1) Запустите инструкцию «ANALYZE TABLE VALIDATE STRUCTURE CASCADE» во всех таблицах, используемых в SQL, чтобы увидеть, есть ли какие-либо повреждения в таблице или ее индексах. 4.2) Проверяйте и удаляйте любые СЛУЧАЙНЫЕ или ПЕРЕДАЧИ ROWS на столе. Есть способы минимизировать это, например, правильную настройку PCTFREE. Использование Примечание 122020,1 - Row Chaining и миграции 4,3) Если таблица дополнительно Index Организованный см: Примечание 102932,1 - Мониторинг Цепочечные Ряды на IOTs

3

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

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

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

Действие: Удалите недетерминированных, где положения и переиздание DML.

+0

Я получал сообщение об ошибке, делающее импорт DataPump через сеть (используя параметр «NETWORK_LINK», который подключается непосредственно к исходной базе данных) на этапе сбора статистики, и ваша подчеркнутая заметка, вероятно, объясняет это. К счастью, статистика была затронута. –