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_1
es 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?
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.
quelle
1) Identifizieren Sie die fehlerhafte Aussage
oder
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
quelle
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):
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:
quelle
NETWORK_LINK
Parameters, 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.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.
quelle
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.
quelle