ORA-30926 erreur à la suite d'une opération de fusion

ORA-30926 erreur se produit généralement lorsque les opérations de fusion, et il est normal que nous laisse quelque peu déplacée, puisque la description de celui-ci ne donne pas beaucoup d'informations sur ce qui se passe:
ORA-30 926: Impossible d'obtenir à la stabilité en Septembre de lignes dans les tables source.

Normalement, cette erreur se produit lorsque l'opération de fusion à une ligne cible à être mis à jour sous lui plus d'une ligne dans la table source. Comme le moteur ne sait pas qui enregistrent à choisir renvoie une erreur. Il s'agit d'un problème de duplication de la table source.

Exemple:

  • Nous avons:
    TABLA_ORIGENavec des valeurs
    Description ID
    1 'La première valeur'
    1 'La valeur id doublé »
    2 'Une autre valeur' Et avec les valeurs TABLA_DESTINO
    Description ID
    1 'Valeur de mettre à jour "
    2 'Cette difficulté ne sera pas "
    3 'Cela reste le même "
  • Nous voulons fusionner avec la déclaration suivante:

Fusionner dest en TABLA_DESTINO
UTILISATION TABLA_ORIGEN ori
ON (= dest.ID ori.ID)
WHEN MATCHED THEN UPDATE SET a.Descripcion b.Descripcion =;

Avec ces données, nous obtenons l'erreur suivante sur TABLA_ORIGEN:
ORA-30926: Impossible d'obtenir un ensemble stable de lignes dans les tables source

  • Compte tenu de cette erreur, nous avons 3 options: 1 -.L'élimination des enregistrements en double de la table source:

TABLA_ORIGEN DELETE FROM WHERE id = 1 description ET = 'La valeur id doublé »

2 -. Passez en revue les principaux moyens que nous faisons la jointure dans la fusion:

Si nous utilisons également le champ Description sur le lien et il n'y aura que zéro ou une source d'enregistrement pour chaque destination:

Fusionner dest en TABLA_DESTINO
UTILISATION TABLA_ORIGEN ori
ON (dest.Descripcion ET ori.ID dest.ID = Ori. Description)
WHEN MATCHED THEN UPDATE SET a.Descripcion b.Descripcion =;

(Cet exemple ne fait pas beaucoup de sens car la table est que ces deux domaines, ainsi que la jointure ne pas trouver de correspondances)

3 -.Utilisez MERGE au lieu d'un UPDATE avec JOIN et HINT / + BYPASS_UJVC * * / pour sauter le moteur de validation, et croisez les doigts:

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

Évidemment, le plus recommandé est le premier ou le deuxième, le cas échéant.