estou obtendo
ORA-30926: Incapaz de obter um conjunto estável de linhas nas tabelas de origem
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';
Eu executei table_1
ele possui dados e também executei a query interna ( src
) que também possui dados.
Por que esse erro ocorreu e como ele pode ser resolvido?
Você provavelmente está tentando atualizar a mesma linha da tabela de destino várias vezes. Acabei de encontrar o mesmo problema em uma declaração de mesclagem que desenvolvi. Verifique se a atualização não toca no mesmo registro mais de uma vez na execução da mesclagem.
fonte
1) Identifique a declaração com falha
ou
e observe os arquivos .trc no UDUMP quando ocorrerem.
2) Após encontrar a instrução SQL, verifique se ela está correta (talvez usando o plano de explicação ou o tkprof para verificar o plano de execução da consulta) e analise ou calcule as estatísticas nas tabelas em questão, se isso não tiver sido feito recentemente. A reconstrução (ou eliminação / recriação) de índices também pode ajudar.
3.1) A instrução SQL é MERGE? avalie os dados retornados pela cláusula USING para garantir que não haja valores duplicados na associação. Modifique a instrução merge para incluir uma cláusula where determinística
3.2) Esta é uma instrução UPDATE através de uma visualização? Nesse caso, tente preencher o resultado da exibição em uma tabela e tente atualizar a tabela diretamente.
3.3) Existe um gatilho na mesa? Tente desativá-lo para ver se ainda falha.
3.4) A declaração contém uma visão não mesclável em uma 'Subconsulta IN'? Isso pode resultar no retorno de linhas duplicadas se a consulta tiver uma cláusula "FOR UPDATE". Veja Bug 2681037
3.5) A tabela possui colunas não utilizadas? Largar estes pode impedir o erro.
4) Se a modificação do SQL não resolver o erro, o problema pode estar na tabela, especialmente se houver linhas encadeadas. 4.1) Execute a instrução 'ANALYZE TABLE VALIDATE STRUCTURE CASCADE' em todas as tabelas usadas no SQL para verificar se há alguma corrupção na tabela ou em seus índices. 4.2) Verifique e elimine quaisquer LINHAS CHAINED ou migradas na tabela. Existem maneiras de minimizar isso, como a configuração correta do PCTFREE. Use a Nota 122020.1 - Encadeamento e migração de linhas 4.3) Se a tabela for adicionalmente organizada por índices, consulte: Nota 102932.1 - Monitorando linhas encadeadas em IOTs
fonte
O erro ocorreu hoje em um 12c e nenhuma das respostas existentes se encaixou (sem duplicatas, sem expressões não determinísticas na cláusula WHERE). Meu caso foi relacionado a essa outra causa possível do erro, de acordo com o texto da mensagem da Oracle (ênfase abaixo):
A mesclagem fazia parte de um lote maior e foi executada em um banco de dados ativo com muitos usuários simultâneos. Não havia necessidade de alterar a declaração. Acabei de confirmar a transação antes da mesclagem, executei a mesclagem separadamente e confirmei novamente. Portanto, a solução foi encontrada na ação sugerida da mensagem:
fonte
NETWORK_LINK
parâmetro que se conecta diretamente ao banco de dados de origem) durante o estágio de coleta de estatísticas, e sua nota destacada provavelmente explica isso. Felizmente, apenas as estatísticas foram afetadas.Este erro ocorreu para mim devido a registros duplicados (16K)
Eu tentei com único que funcionou .
mas novamente quando tentei mesclar sem o mesmo problema ocorreu Segunda vez que era devido a confirmação
após a mesclagem se a confirmação não for feita, o mesmo erro será mostrado.
Sem exclusivo, o Query funcionará se a confirmação for dada após cada operação de mesclagem.
fonte
Um esclarecimento adicional sobre o uso do DISTINCT para resolver o erro ORA-30926 no caso geral:
Você precisa garantir que o conjunto de dados especificado pela cláusula USING () não tenha valores duplicados das colunas de junção , ou seja, as colunas da cláusula ON () .
No exemplo do OP, em que a cláusula USING seleciona apenas uma chave, foi suficiente adicionar DISTINCT à cláusula USING. No entanto, no caso geral, a cláusula USING pode selecionar uma combinação de colunas-chave para combinar e atribuir colunas a serem usadas na cláusula UPDATE ... SET. Portanto, no caso geral, adicionar DISTINCT à cláusula USING ainda permitirá linhas de atualização diferentes para as mesmas chaves; nesse caso, você ainda receberá o erro ORA-30926.
Esta é uma elaboração da resposta de DCookie e do ponto 3.1 da resposta de Tagar, que pela minha experiência pode não ser imediatamente óbvio.
fonte