2015-11-16 15 views
6

Mit einer variablen bar des Typs foo%ROWTYPE ich sowohl INSERT und UPDATE in PL/SQL tun:MERGE mit einer Zeilentypvariablen in PL/SQL auf Oracle?

INSERT INTO foo VALUES bar; 
UPDATE foo SET ROW = bar WHERE id = bar.id; 

Aber wie mache ich einen MERGE? Der folgende Ansatz erzeugt die Fehlermeldung unter:

MERGE INTO foo USING bar ON foo.id = bar.id 
WHEN MATCHED THEN UPDATE SET ROW = bar 
WHEN NOT MATCHED THEN INSERT VALUES bar; 

PL/SQL: ORA-00942: Tabelle oder Sicht nicht

+1

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 –

+0

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

+0

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

Antwort

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

+0

Sofern Sie aus irgendeinem Grund keine Merge-Anweisung verwenden müssen, habe ich eine mögliche alternative Lösung für Sie hinzugefügt. Wie von Solomon Yakobson (https://community.oracle.com/thread/621511?start=0&tstart=0) angegeben, können Sie keinen Rowtype in der When-Matched-Klausel einer Merge-Anweisung verwenden – Chrisrs2292