existiert
Die Antwort MichaelS im Thread gibt oben erwähnt, sollte funktionieren . Die Fehlermeldung, die Sie erhalten (ORA-38104: Spalten in der ON-Klausel verwiesen wird nicht aktualisiert werden kann: foo.id) schlägt vor, Sie versuchen, etwas Ähnliches wie die folgenden Funktionen ausführen:
merge into foo
using (select null from dual)
on (foo.id = bar.id)
when matched then update set foo.id = bar.id, foo.another_field = bar.another_field
when not matched then insert VALUES bar;
Da die Fehlerzustände Spalten, auf die in der ON-Klausel verwiesen wird, können nicht aktualisiert werden. Als solches würde folgendes funktionieren:
merge into foo
using (select null from dual)
on (foo.id = bar.id)
when matched then update set foo.another_field = bar.another_field
when not matched then insert VALUES bar;
Wenn Sie wirklich foo.id aktualisieren müssen, ist eine mögliche Lösung gibt es hier: How to avoid ORA-3814 error on merge?
bearbeiten
Eine mögliche Alternative wäre, Folgendes zu tun:
update foo set row = bar where foo.id = bar.id;
if sql%rowcount = 0 then
insert into foo values bar;
end if;
Dies sollte im Wesentlichen gleich tun, die gleiche Sache wie die Zusammenführung s zu tun Feststellung.
glaube, das wurde auf den Orakel-Foren hier https://community.oracle.com/thread/621511?start=0&tstart=0 beantwortet Salomons Antwort. Es gibt auch eine FORAL Merge, die für Sie arbeiten könnte. http://www.morganslibrary.org/reference/plsql/array_processing.html –
Vielen Dank für Ihre Antwort. Die Solomons-Antwort zählt alle Felder des Rowtypes auf, die den ganzen Punkt der Verwendung eines Rowtyps wegnehmen. Ich bin mir nicht sicher, ob ich verstehe, wie ein FORALL MERGE hier helfen würde. Die Lösung von MichaelS sieht jedoch vielversprechend aus. – Anders
Nein, kann nicht MichaelS Antwort auf Arbeit entweder. Ich bekomme nur 'ORA-38104: Spalten, auf die in der ON-Klausel verwiesen wird, können nicht aktualisiert werden: foo.id' – Anders