2012-04-13 7 views
5

Ich verwende Spring JDBC und Oracle SQL.Oracle SQL Merge-Anweisung mit nur 1 Tabelle und eine Reihe von Werten

Mit der SpringJDBC-Klasse MapSqlParameterSource habe ich die Daten zugeordnet, die ich zusammenführen möchte.

Jetzt möchte ich die Merge-Anweisung verwenden, um Datenbanktabelle zu aktualisieren/einzufügen. Alles, was ich habe, ist eine Tabelle und eine Reihe von Parametern, die ich zusammenführen möchte.

merge into proj.person_registry pr 
using (! parameters should go here somehow?) 
on (pr.id = :id or pr.code = :code) 
when matched then 
update set pr.code    = :code, 
     pr.name     = :name, 
     pr.firstname   = :firstname, 
     pr.cl_gender   = :cl_gender, 
     pr.cl_status   = :cl_status, 
     pr.aadress    = :aadress, 
     pr.aadress_date   = :aadress_date 
when not matched then 
insert values (:code, :name, :firstname, :cl_gender, :cl_status, ;aadress, :aadress_date); 

Muss ich irgendwie eine temporäre Tabelle für die Schlüsselwort erstellen oder gibt es einen anderen Weg? Wie würde ich so zusammen gehen?

auch gibt es zwei eindeutige Schlüssel pr.id und pr.code. Manchmal ist der Parameter : ID ist Null, wenn dies passiert, ich möchte die Update-Anweisung basierend auf pr.code erhalten übereinstimmend mit: Code. Wird es immer noch funktionieren, wenn mein Update, um die Zeile enthält:

update set pr.code    = :code, 
+0

Mit welchem ​​Problem befassen Sie sich? – Teja

+0

Das Schlüsselwort: "using (! Parameter sollte hier irgendwie gehen?)". Muss ich irgendwie eine temporäre Tabelle erstellen und nach der Verwendung einfügen oder gibt es eine andere Möglichkeit, meine Werte in diesen Zusammenführungssatz zu bringen. Und wenn es keinen anderen Weg gibt, wie mache ich eine temporäre Tabelle? – ollo

+0

Nein, Sie brauchen keine temporäre Tabelle ... Überprüfen Sie diesen Link für die Zusammenführungssyntax.http: //docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm – Teja

Antwort

5

Dies sollte funktionieren:

merge into proj.person_registry pr 
using ( 
    select 42 as id 
     'xyz' as code, 
     'Dent' as name, 
     'Arthur' as firstname, 
     'male' as cl_gender 
     'closed' as cl_status, 
     'Somewher' as aaddress, 
     current_date as aaddress_date 
    from dual 
) t on (pr.id = t.id or pr.code = t.code) 
when matched then 
update set pr.code    = t.code, 
     pr.name     = t.name, 
     pr.firstname   = t.firstname, 
     pr.cl_gender   = t.cl_gender, 
     pr.cl_status   = t.cl_status, 
     pr.aadress    = t.aadress, 
     pr.aadress_date   = t.aadress_date 
when not matched then 
insert values (t.code, t.name, t.firstname, t.cl_gender, t.cl_status, ;aadress, t.aadress_date); 

Ich bin nicht vertraut mit Spring JDBC-Vorlage, aber die tatsächlichen Werte in der select ... from dual Abfrage durch Parameter ersetzt Platzhalter sollten funktionieren.

+0

Danke, das funktioniert fast. Das einzige Problem, das bleibt, ist, dass ich ** pr.code ** nicht aktualisieren kann, weil ich es in der ** ON ** -Klausel referenziere: 'on (pr.id = t.id oder pr.code = t.code)' . Dies ist kein Problem, wenn ich das Update mit 'pr.code = t.code' eingebe, aber wenn ich es mit' pr.id = t.id' eintrage, muss ** pr.code ** aktualisiert werden. – ollo

+0

Warum? ist diese Einschränkung für die Merge-Klausel sowieso ..? – ollo

Verwandte Themen