Ich bekomme
ORA-30926: Es ist nicht möglich, einen stabilen Satz von Zeilen in den Quelltabellen zu erhalten
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';
I've lief table_1
es hat Daten und auch I've lief die innere Abfrage (src
), die auch Daten hat.
Warum tritt dieser Fehler auf und wie kann er behoben werden?
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 die gleiche ROWID mehrmals zurückgegeben wird.
Sie können das Problem schnell lösen, indem Sie ein DISTINCT in Ihrer Abfrage verwenden (wenn 'Y' ein konstanter Wert ist, brauchen Sie ihn nicht einmal in die Abfrage aufzunehmen).
Unter der Annahme, dass Ihre Abfrage korrekt ist (ich kenne Ihre Tabellen nicht), könnten Sie etwas wie folgt 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';
Sie versuchen wahrscheinlich, dieselbe Zeile der Zieltabelle mehrmals zu aktualisieren. Ich bin gerade auf genau dasselbe Problem in einer von mir entwickelten Zusammenführungsanweisung gestoßen. Stellen Sie sicher, dass Ihre Aktualisierung denselben Datensatz nicht mehr als einmal während der Ausführung der Zusammenführung berührt.
Wie behebt man ORA-30926-Fehler? (Doc ID 471956.1)
alter session set events '30926 trace name errorstack level 3';
oder
alter system set events '30926 trace name errorstack off';
und achten Sie auf .trc-Dateien in UDUMP, wenn der Fehler auftritt.
3.1) Ist die SQL-Anweisung ein MERGE? Werten Sie die von der USING-Klausel zurückgegebenen Daten aus, um sicherzustellen, dass es keine doppelten Werte in der Verknüpfung gibt. Ändern Sie die Merge-Anweisung so, dass sie eine deterministische Where-Klausel enthält
3.2) Handelt es sich um eine UPDATE-Anweisung über einen View? Wenn ja, versuchen Sie, das View-Ergebnis in eine Tabelle einzupflegen und die Tabelle direkt zu aktualisieren.
3.3) Gibt es einen Trigger für die Tabelle? Versuchen Sie, ihn zu deaktivieren, um zu sehen, ob der Vorgang immer noch fehlschlägt.
3.4) Enthält die Anweisung eine nicht zusammenführbare Ansicht in einer 'IN-Subquery'? 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 unbenutzte Spalten? Wenn Sie diese weglassen, kann der Fehler vermieden werden.