2010-02-25 6 views
94

Ich erhalteORA-30926: nicht in der Lage, eine stabile Gruppe von Zeilen in den Quelltabellen zu bekommen

ORA-30926: nicht in der Lage, eine stabile Gruppe von Zeilen in den Quelltabellen zu bekommen

in der folgenden Abfrage:

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

ich habe table_1 lief es Daten hat und auch habe ich lief das Innere Abfrage (src), die auch Daten hat.

Warum sollte dieser Fehler kommen und wie kann er gelöst werden?

Antwort

145

Dies wird normalerweise durch Duplikate in der in der USING-Klausel angegebenen Abfrage verursacht. Dies bedeutet wahrscheinlich, dass TABLE_A eine Elterntabelle ist und dieselbe ROWID mehrmals zurückgegeben wird.

Sie könnten das Problem schnell lösen, indem Sie ein DISTINCT in Ihrer Abfrage verwenden (in der Tat, wenn 'Y' ein konstanter Wert ist, müssen Sie es nicht einmal in die Abfrage einfügen).

Angenommen, Ihre Abfrage korrekt ist (weiß nicht, Ihre Tabellen) Sie so etwas tun könnte:

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

10x Schöne Antwort. Es half mir –

+0

Von mir auch .. direkt am Kopf – TonyP

+1

Dies ist wahrscheinlich, warum andere Ansätze (für mich) auch andere Fehler für mich zurückgegeben (wie 'Prozedur, Funktion, Paket oder Typ ist hier nicht erlaubt' und 'Kann nicht ändern a Spalte, die zu einem nicht Schlüssel-konservierten Tabellenfehler beim Einfügen in eine Ansicht "). ~ Wenn es jemand anderen hilft, habe ich den gleichen Fehler auch nach dem Hinzufügen distinct in, bis ich die Joins meiner inneren Abfrage neu angeordnet, so begann ich mit der Tabelle, die mehr als eine Zeile zurückgegeben wurde und innere verbunden von dort ... wenn das Sinn macht. – jinglesthula

33

Sie versuchen wahrscheinlich, dieselbe Zeile der Zieltabelle mehrmals zu aktualisieren. Ich habe gerade das gleiche Problem in einer Merge-Anweisung, die ich entwickelt habe, entdeckt. Stellen Sie sicher, dass Ihr Update den gleichen Datensatz nicht mehr als einmal in der Ausführung der Zusammenführung berührt.

+0

+1, danke, das ist mir zufällig auf einer Zieltabelle mit einer kleinen Anzahl von Duplikaten passiert (zumindest basierend auf den Schlüsseln in der Zusammenführung verwendet). – tbone

2

Wie ORA-30926 Fehler beheben? (Doc-ID 471956,1)

1) Identifizieren Sie die fehlerhafte Anweisung

alte Sitzung Satz Ereignisse ‚30926 Spur Namen errorstack Ebene 3‘;

oder

altes System gesetzt Ereignisse ‚30926 Spur Name errorstack off‘;

und nach .trc-Dateien in UDUMP suchen, wenn sie auftritt.

2) Nachdem Sie die SQL-Anweisung gefunden haben, prüfen Sie, ob sie korrekt ist (möglicherweise mithilfe von explain plan oder tkprof, um den Abfrageausführungsplan zu überprüfen) und Statistiken zu den betreffenden Tabellen zu analysieren oder zu berechnen. Das erneute Erstellen (oder Löschen/Neuerstellen) von Indizes kann ebenfalls hilfreich sein.

3.1) Ist die SQL-Anweisung eine MERGE? Bewerten Sie die von der USING-Klausel zurückgegebenen Daten, um sicherzustellen, dass keine doppelten Werte in der Verknüpfung vorhanden sind. Ändern Sie die Zusammenführungsanweisung so, dass sie eine deterministische Where-Klausel enthält.

3.2) Ist dies eine UPDATE-Anweisung über eine Sicht? Wenn ja, versuchen Sie das Suchergebnis in eine Tabelle zu füllen und versuchen Sie, die Tabelle direkt zu aktualisieren.

3.3) Liegt ein Trigger auf dem Tisch? Versuchen Sie es zu deaktivieren, um zu sehen, ob es immer noch fehlschlägt.

3.4) Enthält die Anweisung eine nicht zusammenführbare Sicht in einer 'IN-Unterabfrage'? Dies kann dazu führen, dass doppelte Zeilen zurückgegeben werden, wenn die Abfrage eine Klausel "FOR UPDATE" enthält. Siehe Bug 2681037

3.5) Hat die Tabelle ungenutzte Spalten? Das Ablegen dieser kann den Fehler verhindern.

4) Wenn das Ändern der SQL den Fehler nicht behebt, kann das Problem mit der Tabelle auftreten, insbesondere wenn verkettete Zeilen vorhanden sind. 4.1) Führen Sie die Anweisung 'ANALYZE TABLE VALIDATE STRUCTURE CASCADE' für alle Tabellen aus, die in SQL verwendet werden, um festzustellen, ob in der Tabelle oder ihren Indizes Fehler vorhanden sind. 4.2) Überprüfen Sie alle CHAINED- oder migrierten ROWs auf der Tabelle, und beseitigen Sie sie. Es gibt Möglichkeiten, dies zu minimieren, z. B. die korrekte Einstellung von PCTFREE. Verwendung Hinweis 122.020,1 - Row Chaining und Migration 4.3) Wenn die Tabelle zusätzlich Index organisiert ist, finden Sie unter: Hinweis 102.932,1 - Überwachung Chained Rows auf IOTs

3

Hatte den Fehler heute auf einem 12c und keine der vorhandenen Antworten fit (keine Duplikate, keine nicht-deterministischen Ausdrücke in der WHERE-Klausel). Mein Fall wurde an dieser anderen möglichen Ursache des Fehlers im Zusammenhang, nach Oracle Meldungstext (Schwerpunkt unten):

ORA-30926: nicht in der Lage, eine stabile Gruppe von Zeilen in den Quelltabellen
Ursache zu bekommen: A stabile Reihe von Zeilen konnte nicht aufgrund der großen dml-Aktivität oder eine nicht deterministische where-Klausel erhalten.

Die Zusammenführung war Teil eines größeren Stapels und wurde in einer Live-Datenbank mit vielen gleichzeitigen Benutzern ausgeführt. Es gab keine Notwendigkeit, die Aussage zu ändern. Ich habe gerade die Transaktion vor der Zusammenführung festgeschrieben, dann die Zusammenführung getrennt ausgeführt und erneut committed. So wurde die Lösung in der vorgeschlagenen Aktion der Nachricht gefunden:

Aktion: Entfernen Sie alle nicht-deterministisch, wo Klauseln und die DML erneut ab.

+0

Ich bekam diese Fehlermeldung, die einen DataPump-Import über das Netzwerk (mit 'NETWORK_LINK' -Parameter, der direkt mit der Quelldatenbank verbindet) während der Statistikerfassungsstufe durchführt, und Ihre hervorgehobene Notiz erklärt es wahrscheinlich. Zum Glück waren nur die Statistiken betroffen. –