2012-04-13 2 views
5

스프링 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 문에 도달하려고합니다. 내 업데이트 라인이 포함 된 경우 여전히 작동합니다

update set pr.code    = :code, 
+0

직면 한 문제는 무엇입니까? – Teja

+0

키워드 : "using (! parameters는 어쨌든 여기에 있어야합니까?"). 어떻게 든 임시 테이블을 만들고이를 사용하거나이 병합 문장에 내 값을 가져 오는 다른 방법이 있어야합니다. 그리고 다른 방법이 없다면 어떻게 임시 테이블을 만드나요? – ollo

+0

아니요 임시 테이블이 필요하지 않습니다 ...이 링크에서 병합 구문을 확인하십시오 .http : //docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm – Teja

답변

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

+0

왜 어쨌든 병합 절에이 제약이 있습니까? – ollo