2012-04-13 33 views
5

我正在使用Spring JDBC和Oracle SQL。只有一個表和一堆值的Oracle SQL合併語句

使用SpringJDBC類MapSqlParameterSource,我映射了我想要合併的數據。

現在我想使用合併語句來更新/插入數據庫表。我只有一張桌子和一堆我想融入其中的參數。

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

我一定要使用關鍵字在某種程度上創造了臨時表或有另一種方式?我將如何去合併這樣?

還有兩個唯一的鍵pr.id和pr.code。有時參數:IDnull,當發生這種情況時,我想要達到基於pr.code獲取匹配的更新語句:代碼。如果我的更新包含該生產線將它仍然工作:

update set pr.code    = :code, 
+0

你面臨什麼問題? – Teja 2012-04-13 13:54:28

+0

關鍵字:「使用(!參數應該在這裏以某種方式?)」。我不得不以某種方式創建一個臨時表,並在使用後放置該表,或者有其他方式讓我的值進入這個合併句子。如果沒有其他方法,我如何製作臨時表? – ollo 2012-04-13 14:01:44

+0

不,你不需要任何臨時表......檢查這個鏈接是否合併syntax.http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm – Teja 2012-04-13 14:03:58

回答

5

這應該工作:

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

我不熟悉Spring的JDBC模板,但參數在select ... from dual查詢替換實際值佔位符應該工作。

+0

感謝這幾乎成功。唯一的問題是,我不能更新** pr.code **,因爲我在** ON **子句中引用它:'on(pr.id = t.id或pr.code = t.code)' 。如果我用'pr.code = t.code'輸入更新,這個問題不是問題,但是如果我用'pr.id = t.id'輸入** ** pr.code **需要更新。 – ollo 2012-04-16 11:25:48

+0

爲什麼無論如何,這是合併條款的約束..? – ollo 2012-04-16 11:33:48