Eu estou recebendo
ORA-30926: incapaz de obter um conjunto estável de filas nas tabelas de fontes
na seguinte consulta:
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';
I'executei a table_1
que tem dados e também I'executei a consulta interna (src
) que também tem dados.
Porque viria este erro e como pode ser resolvido?
Isso geralmente é causado por duplicatas na consulta especificada na cláusula USING. Isto provavelmente significa que TABLE_A é uma tabela pai e o mesmo ROWID é retornado várias vezes.
Você poderia resolver o problema rapidamente usando um DISTINCT na sua consulta (na verdade, se 'Y' é um valor constante que você não'nem precisa colocá-lo na consulta).
Assumindo que sua consulta está correta (don't know your tables) você poderia fazer algo como isto:
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';
Você'provavelmente está tentando atualizar a mesma linha da tabela de destino várias vezes. Eu acabei de encontrar o mesmo problema em uma declaração de fusão que desenvolvi. Certifique-se que sua atualização não toque o mesmo registro mais de uma vez na execução da fusão.
Como resolver problemas de erros do ORA-30926? (Doc ID 471956.1)
alterar eventos do conjunto de sessões '30926 trace name errorstack level 3';
ou
alterar eventos do sistema '30926 trace name errorstack off';
e observe os arquivos .trc no UDUMP quando ele ocorrer.
3.1) A instrução SQL é uma MERGE? avalia os dados devolvidos pela cláusula USING para garantir que não existem valores duplicados no join. Modifique a instrução merge para incluir uma cláusula determinística onde
3.2) Esta é uma declaração UPDATE através de uma vista? Em caso afirmativo, tente preencher o resultado da view em uma tabela e tente atualizar a tabela diretamente.
3.3) Há um gatilho em cima da mesa? Tente desativá-lo para ver se ele ainda falha.
3.4) A declaração contém uma visão não fusível em um 'IN-Subquery'? Isto pode resultar na devolução de linhas duplicadas se a consulta tiver um "FOR UPDATE" clause. Veja o Bug 2681037
3.5) A tabela tem colunas não utilizadas? Deixar cair estas colunas pode evitar o erro.