web-dev-qa-db-fra.com

ORA-30926: impossible d'obtenir un ensemble stable de lignes dans les tables source

Je reçois

ORA-30926: impossible d'obtenir un ensemble stable de lignes dans les tables source

dans la requête suivante:

  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';

J'ai exécuté table_1 il contient des données et j'ai également lancé la requête interne (src) qui contient également des données.

Pourquoi cette erreur arriverait-elle et comment peut-elle être résolue?

116
Omnipresent

Cela est généralement dû à des doublons dans la requête spécifiée dans la clause USING. Cela signifie probablement que TABLE_A est une table parent et que le même ROWID est renvoyé plusieurs fois.

Vous pouvez rapidement résoudre le problème en utilisant un objet DISTINCT dans votre requête (en fait, si "Y" est une valeur constante, vous n'avez même pas besoin de le mettre dans la requête).

En supposant que votre requête soit correcte (vous ne connaissez pas vos tables), vous pourriez faire quelque chose comme ceci:

  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';
179
Pop

Vous essayez probablement de mettre à jour la même ligne de la table cible plusieurs fois. Je viens de rencontrer le même problème dans une déclaration de fusion que j'ai développée. Assurez-vous que votre mise à jour ne touche pas le même enregistrement plus d'une fois lors de l'exécution de la fusion.

39
DCookie

Si l'erreur d'aujourd'hui sur 12c et qu'aucune des réponses existantes ne correspondait (pas de doublons, pas d'expressions non déterministes dans la clause WHERE). Mon cas était lié à cette autre cause possible de l'erreur, selon le texte du message d'Oracle (souligné ci-dessous):

ORA-30926: impossible d'obtenir un ensemble stable de lignes dans les tables source
Cause: Un ensemble de lignes stable n'a pas pu être obtenu en raison d'une activité dml importante ou une clause where non déterministe.

La fusion faisait partie d'un lot plus important et a été exécutée sur une base de données active avec de nombreux utilisateurs simultanés. Il n'y avait pas besoin de changer la déclaration. Je viens de valider la transaction avant la fusion, puis de l'exécuter séparément et de la commettre à nouveau. La solution a donc été trouvée dans l'action suggérée du message:

Action: Supprimez toutes les clauses where non déterministes et relancez le dml.

5
dlatikay

Comment résoudre les erreurs ORA-30926? (Doc ID 471956.1)

1) Identifier l'énoncé défaillant

modifier les événements d’ensemble de session ‘30926, niveau 3, pile de noms de traces d’erreur ';

ou

modifier les événements de configuration du système ‘30926 trace of errorstack off’;

et surveillez les fichiers .trc dans UDUMP quand cela se produit.

2) Après avoir trouvé l’instruction SQL, vérifiez si elle est correcte (utilisez peut-être explicitement plan ou tkprof pour vérifier le plan d’exécution de la requête) et analysez ou calculez des statistiques sur les tables concernées si cela n’a pas été fait récemment. Reconstruire (ou supprimer/recréer) des index peut aussi aider.

3.1) L'instruction SQL est-elle une fusion? évaluez les données renvoyées par la clause USING pour vous assurer qu'il n'y a pas de valeurs en double dans la jointure. Modifier l'instruction de fusion pour inclure une clause where déterministe

3.2) S'agit-il d'une déclaration UPDATE via une vue? Si c'est le cas, essayez de renseigner le résultat de la vue dans une table et essayez de mettre à jour la table directement.

3.3) Y a-t-il un déclencheur sur la table? Essayez de le désactiver pour voir s'il échoue toujours.

3.4) La déclaration contient-elle une vue non fusionnable dans une "sous-requête"? Cela peut entraîner le renvoi de lignes en double si la requête contient une clause "FOR UPDATE". Voir bug 2681037

3.5) La table a-t-elle des colonnes non utilisées? Le fait de les supprimer peut empêcher l’erreur.

4) Si la modification du code SQL ne corrige pas l'erreur, le problème peut être lié à la table, en particulier s'il existe des lignes chaînées. 4.1) Exécutez l’instruction ‘ANALYZE TABLE VALIDATE STRUCTURE CASCADE’ sur toutes les tables utilisées dans le code SQL pour voir s’il existe des altérations dans la table ou ses index. 4.2) Vérifiez et éliminez toutes les lignes du réseau chaînées ou migrées sur la table. Il existe des moyens de minimiser cela, tels que le réglage correct de PCTFREE. Utiliser la note 122020.1 - Chaînage et migration de lignes 4.3) Si le tableau est également organisé en index, voir: Note 102932.1 - Surveillance des lignes chaînées sur des IOT.

5
Tagar
SQL Error: ORA-30926: unable to get a stable set of rows in the source tables
30926. 00000 -  "unable to get a stable set of rows in the source tables"
*Cause:    A stable set of rows could not be got because of large dml
           activity or a non-deterministic where clause.
*Action:   Remove any non-deterministic where clauses and reissue the dml.

Cette erreur s’est produite pour moi à cause des enregistrements en double (16K)

Je essayé avec unique cela a fonctionné.

mais encore une fois quand j'ai essayé de fusionner sans que le même problème se produise

après la fusion si la validation n'est pas effectuée, la même erreur sera affichée.

Sans unique, Query fonctionnera si commit est donné après chaque opération de fusion.

1
v8-E