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 sources

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 couru {[1] } Il a des données et aussi j'ai couru la requête intérieure (src) qui a aussi des données.

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

100
demandé sur diziaq 2010-02-25 23:13:59

5 réponses

Ceci est généralement causé par 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 retourné plusieurs fois.

Vous pouvez rapidement résoudre le problème en utilisant un 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 est correcte (ne connaissez pas vos tables), vous pouvez 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';
161
répondu Pop 2010-02-25 20:42:29

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.

36
répondu DCookie 2010-02-25 20:21:02

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

1) Identifier l'instruction défaillante

Alter session set événements " 30926 trace nom errorstack niveau 3’;

Ou

Alter system set événements " 30926 trace nom errorstack off’;

Et surveillez .fichiers trc dans UDUMP quand il se produit.

2) Après avoir trouvé L'instruction SQL, vérifiez si elle est correcte (peut-être en utilisant explain plan ou tkprof pour vérifier la requête plan d'exécution) et analyser ou calculer des statistiques sur les tableaux concernés si cela n'a pas été fait récemment. Reconstruire (ou supprimer/recréer) les 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 dupliquées dans la jointure. Modifiez l'instruction merge pour inclure une clause WHERE déterministe

3.2) Est-ce une instruction de mise à jour via une vue? Si c'est le cas, essayez de remplir 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) l'instruction contient-elle une vue Non fusionnable dans une 'IN-Subquery'? Cela peut entraîner le retour de lignes en double si la requête a une clause" FOR UPDATE". Voir Le Bogue 2681037

3.5) la table a-t-elle des colonnes inutilisées? La suppression de ceux - ci peut empêcher l'erreur.

4) si la modification du SQL ne corrige pas l'erreur, le problème peut être avec la table, surtout s'il y a des lignes enchaînées. 4.1) exécutez l'instruction 'ANALYZE TABLE VALIDATE structure CASCADE' sur toutes les tables utilisées dans le SQL pour voir s'il y a des corruptions dans la table ou ses index. 4.2) Vérifiez et éliminez toutes les lignes chaînées ou migrées sur la table. Il existe des moyens de minimiser cela, tels que le réglage correct de PCTFREE. Utilisez la Note 122020.1-chaînage et Migration de lignes 4.3) si le tableau est en outre Index organisé, voir: Note 102932.1-Surveillance Lignes enchaînées sur IOTs

3
répondu Tagar 2016-04-01 21:44:32

A eu l'erreur aujourd'hui sur un 12c et aucune des réponses existantes ne correspond (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 (emphase ci-dessous):

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

Le la fusion faisait partie d'un lot plus important et a été exécutée sur une base de données en direct 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 d'exécuter la fusion séparément et de la valider à nouveau. Donc, la solution a été trouvée dans l'action suggérée du message:

Action: supprime toute clause where non déterministe et réédite le dml .

3
répondu dlatikay 2016-06-21 10:41:21
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 en raison d'enregistrements en double (16K)

Je essayé avec unique cela a fonctionné .

Mais encore une fois quand j'ai essayé de fusionner sans unique même problème s'est produit La deuxième fois, il était dû commettre

Après la fusion si la validation n'est pas fait la même Erreur sera affichée.

Sans unique, la requête fonctionnera si la validation est donnée après chaque opération de fusion.

1
répondu v8-E 2018-07-26 02:38:49