2012-04-13 8 views
5

Sto utilizzando Spring JDBC e Oracle Oracle.Istruzione SQL merge SQL con solo 1 tabella e un gruppo di valori

utilizzando la classe SpringJDBC MapSqlParameterSource, ho mappato i dati che voglio unire.

Ora voglio utilizzare l'istruzione di unione per aggiornare/inserire la tabella del database. Tutto quello che ho è un tavolo e un mucchio di parametri che voglio unire in esso.

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); 

devo creare in qualche modo una tabella temporanea per il utilizzando parola chiave o c'è un altro modo? come faccio a fondermi in questo modo?

inoltre ci sono due chiavi univoche pr.id e pr.code. A volte il parametro : id è null, quando ciò accade, voglio raggiungere l'istruzione di aggiornamento basata su pr.code ottenendo la corrispondenza con: codice. Sarà ancora funzionare se il mio aggiornamento contiene la riga:

update set pr.code    = :code, 
+0

Che problema stai affrontando? – Teja

+0

La parola chiave: "usando (i parametri! Dovrebbero andare qui in qualche modo?)". Devo creare un tavolo temporaneo in qualche modo e metterlo dopo l'uso o c'è un altro modo per ottenere i miei valori in questa frase di fusione. E se non c'è altro modo, come faccio a creare un tavolo temporaneo? – ollo

+0

No, non hai bisogno di alcuna tabella temporanea ... Controlla questo link per unire syntax.http: //docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm – Teja

risposta

5

Questo dovrebbe funzionare:

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); 

io non sono a conoscenza del modello JDBC di primavera, ma sostituendo i valori effettivi nella query select ... from dual dal parametro i segnaposto dovrebbero funzionare

+0

Grazie funziona quasi. L'unico problema che rimane è che non posso aggiornare ** pr.code ** perché lo sto facendo riferimento nella clausola ** ON **: 'on (pr.id = t.id o pr.code = t.code)' . Questo non è un problema se inserisco l'aggiornamento con 'pr.code = t.code', ma se lo inserisco con' pr.id = t.id' ** pr.code ** deve essere aggiornato .. – ollo

+0

Perché è comunque questo vincolo sulla clausola di fusione ...? – ollo