ORA-30926: Es kann kein stabiler Satz von Zeilen in den Quelltabellen abgerufen werden


129

ich bekomme

ORA-30926: Es kann kein stabiler Satz von Zeilen in den Quelltabellen abgerufen werden

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 ausgeführt, dass table_1es Daten enthält, und ich habe auch die interne Abfrage ( src) ausgeführt, die auch Daten enthält.

Warum sollte dieser Fehler auftreten und wie kann er behoben werden?

Antworten:


202

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

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

Angenommen, Ihre Abfrage ist korrekt (Sie kennen Ihre Tabellen nicht), könnten Sie Folgendes tun:

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

1
Dies ist wahrscheinlich der Grund, warum andere Ansätze (für mich) auch andere Fehler für mich zurückgegeben haben (z. B. 'Prozedur, Funktion, Paket oder Typ sind hier nicht zulässig' und 'Eine Spalte, die einem nicht schlüsselerhaltenen Tabellenfehler zugeordnet ist, kann beim Versuch nicht geändert werden in eine Ansicht einfügen '). ~ Wenn es jemand anderem hilft, habe ich den gleichen Fehler erhalten, auch nachdem ich eine eindeutige Eingabe hinzugefügt habe, bis ich die Verknüpfungen meiner inneren Abfrage neu angeordnet habe, sodass ich mit der Tabelle begonnen habe, in der mehr als eine Zeile zurückgegeben und die innere von dort verbunden wurde ... wenn dies der Fall ist macht Sinn.
Jinglesthula

40

Sie versuchen wahrscheinlich, dieselbe Zeile der Zieltabelle mehrmals zu aktualisieren. Ich habe gerade das gleiche Problem in einer von mir entwickelten Zusammenführungsanweisung festgestellt. Stellen Sie sicher, dass Ihr Update denselben Datensatz bei der Ausführung der Zusammenführung nicht mehr als einmal berührt.


1
+1, danke, das ist mir gerade auf einer Zieltabelle mit einer kleinen Anzahl von Duplikaten passiert (zumindest basierend auf den beim Zusammenführen verwendeten Schlüsseln).
Knochen

6

Wie behebe ich ORA-30926-Fehler? (Doc ID 471956.1)

1) Identifizieren Sie die fehlerhafte Aussage

Sitzungssatzereignisse ändern '30926 Trace Name Errorstack Level 3';

oder

Ändern Sie die System-Set-Ereignisse '30926 Trace Name Errorstack Off'.

und achten Sie in UDUMP auf TRC-Dateien, wenn dies auftritt.

2) Nachdem Sie die SQL-Anweisung gefunden haben, überprüfen Sie, ob sie korrekt ist (möglicherweise mithilfe von EXPLAIN Plan oder tkprof, um den Abfrageausführungsplan zu überprüfen), und analysieren oder berechnen Sie Statistiken zu den betreffenden Tabellen, falls dies nicht kürzlich geschehen ist. Das Neuerstellen (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 der Join keine doppelten Werte enthält. Ändern Sie die Merge-Anweisung so, dass sie eine deterministische where-Klausel enthält

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

3.3) Gibt es einen Auslöser auf dem Tisch? Deaktivieren Sie es, um festzustellen, ob es immer noch fehlschlägt.

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

3.5) Hat die Tabelle nicht verwendete Spalten? Das Löschen dieser kann den Fehler verhindern.

4) Wenn das Ändern des SQL den Fehler nicht behebt, liegt das Problem möglicherweise an der Tabelle, insbesondere wenn verkettete Zeilen vorhanden sind. 4.1) Führen Sie die Anweisung 'ANALYZE TABLE VALIDATE STRUCTURE CASCADE' für alle in SQL verwendeten Tabellen aus, um festzustellen, ob die Tabelle oder ihre Indizes beschädigt sind. 4.2) Überprüfen Sie die Tabelle auf KETTEN oder migrierte REIHEN und entfernen Sie sie. Es gibt Möglichkeiten, dies zu minimieren, z. B. die korrekte Einstellung von PCTFREE. Verwenden Sie Hinweis 122020.1 - Zeilenverkettung und -migration. 4.3) Wenn die Tabelle zusätzlich indexorganisiert ist, lesen Sie: Hinweis 102932.1 - Überwachen verketteter Zeilen auf IOTs


5

Hatte den Fehler heute auf einem 12c und keine der vorhandenen Antworten passte (keine Duplikate, keine nicht deterministischen Ausdrücke in der WHERE-Klausel). Mein Fall bezog sich auf die andere mögliche Fehlerursache gemäß dem Nachrichtentext von Oracle (Hervorhebung unten):

ORA-30926: Es kann kein stabiler Satz von Zeilen in den Quelltabellen abgerufen werden.
Ursache: Ein stabiler Satz von Zeilen konnte aufgrund einer großen dml-Aktivität oder einer nicht deterministischen where-Klausel nicht abgerufen werden.

Die Zusammenführung war Teil eines größeren Stapels und wurde in einer Live-Datenbank mit vielen gleichzeitigen Benutzern ausgeführt. Die Aussage musste nicht geändert werden. Ich habe die Transaktion gerade vor dem Zusammenführen festgeschrieben, dann die Zusammenführung separat ausgeführt und erneut festgeschrieben. Die Lösung wurde also in der vorgeschlagenen Aktion der Nachricht gefunden:

Aktion: Entfernen Sie alle nicht deterministischen where-Klauseln und geben Sie die dml erneut aus .


Ich habe diese Fehlermeldung erhalten, als ich einen DataPump-Import über das Netzwerk (unter Verwendung eines NETWORK_LINKParameters, der eine direkte Verbindung zur Quellendatenbank herstellt) während der Phase der Statistikerfassung durchgeführt habe, und Ihre hervorgehobene Notiz erklärt dies wahrscheinlich. Zum Glück waren nur die Statistiken betroffen.
Mark Stewart

1
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.

Dieser Fehler trat bei mir aufgrund doppelter Datensätze (16 KB) auf.

Ich habe es mit Unique versucht, es hat funktioniert .

Aber als ich erneut versuchte, eine Zusammenführung ohne eindeutiges Problem durchzuführen, trat das zweite Mal ein Commit auf

Nach dem Zusammenführen wird derselbe Fehler angezeigt, wenn das Festschreiben nicht erfolgt.

Ohne eindeutige Funktion funktioniert die Abfrage, wenn nach jedem Zusammenführungsvorgang ein Commit erfolgt.


-1

Eine weitere Klarstellung zur Verwendung von DISTINCT zur Behebung des Fehlers ORA-30926 im allgemeinen Fall:

Sie müssen sicherstellen, dass der in der USING () -Klausel angegebene Datensatz keine doppelten Werte der Join-Spalten enthält , dh der Spalten in der ON () -Klausel .

In OPs Beispiel, in dem die USING-Klausel nur einen Schlüssel auswählt, war es ausreichend, der USING-Klausel DISTINCT hinzuzufügen. Im allgemeinen Fall kann die USING-Klausel jedoch eine Kombination von zu übereinstimmenden Schlüsselspalten und Attributspalten auswählen, die in der UPDATE ... SET-Klausel verwendet werden sollen. Daher werden im Allgemeinen durch Hinzufügen von DISTINCT zur USING-Klausel weiterhin unterschiedliche Aktualisierungszeilen für dieselben Schlüssel zugelassen. In diesem Fall wird weiterhin der Fehler ORA-30926 angezeigt.

Dies ist eine Ausarbeitung von DCookies Antwort und Punkt 3.1 in Tagars Antwort, die meiner Erfahrung nach möglicherweise nicht sofort offensichtlich ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.