Erro ORA-30926, como resultado de uma operação de mesclagem

ORA 30926 erro geralmente ocorre quando as operações de impressão em série, e é normal que nos deixa um tanto equivocada, uma vez que a descrição de que não dá muita informação sobre o que está acontecendo:
ORA-30926: não foi possível obter a estabilidade em setembro de linhas nas tabelas de origem.

Normalmente esse erro ocorre quando a operação direta para uma linha de destino para ser atualizado com ele mais de uma linha na tabela de origem. Como o motor não sabe qual registro para escolher retornará um erro. É um problema de duplicação na tabela de origem.

Exemplo:

  • Nós temos:
    TABLA_ORIGENcom valores
    Descrição ID
    1 'O valor do primeiro'
    1 'O valor do id duplicado "
    2 'outro valor' E com os valores TABLA_DESTINO
    Descrição ID
    1 'Valor para update'
    2 'Este problema não vai'
    3 'Este é o mesmo'
  • Queremos mesclar usando a seguinte instrução:

Merge TABLA_DESTINO em dest
USANDO TABLA_ORIGEN ori
ON (dest.ID ori.ID =)
QUANDO correspondida, UPDATE SET a.Descripcion b.Descripcion =;

Com estes dados obtemos o seguinte erro em TABLA_ORIGEN:
ORA-30926: Falha ao obter um conjunto estável de linhas nas tabelas de origem

  • Dado este erro, temos três opções: 1 -.Eliminar registros duplicados da tabela de origem:

TABLA_ORIGEN DELETE FROM WHERE id = 1 descricao E = 'O valor de id duplicado "

2 -. Reveja as principais formas que nós fazemos a juntar-se na mala direta:

Se nós também usar o campo de Descrição sobre o link e só haverá zero ou uma fonte de registro para cada destino:

Merge TABLA_DESTINO em dest
USANDO TABLA_ORIGEN ori
Sobre (e dest.Descripcion ori.ID dest.ID = ori Descrição).
QUANDO correspondida, UPDATE SET a.Descripcion b.Descripcion =;

(Este exemplo não faz muito sentido porque a tabela é apenas estes dois campos, e também a associação não encontrar correspondências)

3 -.Use MERGE em vez de um UPDATE com JOIN e uma dica / + BYPASS_UJVC * * / para pular o mecanismo de validação, e cruzar os dedos:

UPDATE / * + * BYPASS_UJVC /
(SELECT ori.ID ori_ID,
& Nb
sp; ori_Descripcion ori.Descripcion,
dest.ID dest_ID,
dest.Descripcion dest_Descripcion
DA TABLA_ORIGEN ori, dest TABLA_DESTINO
ONDE ori.ID dest.ID =)
dest_Descripcion SET ori_Descripcion =;

Obviamente, os mais recomendados são o primeiro ou segundo, conforme o caso.