2012-04-13 6 views
5

Estoy usando Spring JDBC y Oracle SQL.instrucción de combinación Oracle SQL con solo 1 tabla y un grupo de valores

usando la clase SpringJDBC MapSqlParameterSource, he mapeado los datos que deseo fusionar.

Ahora quiero usar la declaración de fusión para actualizar/insertar la tabla de la base de datos. Todo lo que tengo es una tabla y un conjunto de parámetros en los que me quiero fusionar.

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

¿Tengo que crear algún modo una tabla temporal para el uso de palabra clave o hay otra manera? ¿Cómo voy a fusionarme así?

también hay dos claves únicas pr.id y pr.code. A veces, el parámetro : id es nulo, cuando esto sucede, quiero llegar a la declaración de actualización basada en la coincidencia de pr.code con: código. ¿Va a seguir trabajando si mi actualización contiene la línea:

update set pr.code    = :code, 
+0

¿Qué problema está enfrentando? – Teja

+0

La palabra clave: "using (! Los parámetros deberían ir aquí de alguna manera?)". ¿Tengo que crear una tabla temporal de alguna manera y poner eso después de usar o hay alguna otra manera de obtener mis valores en esta oración de fusión. Y si no hay otra manera, ¿cómo hago una tabla temporal? – ollo

+0

No, no necesita ninguna tabla temporal ... Consulte este enlace para ver la sintaxis de combinación.http: //docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm – Teja

Respuesta

5

Esto debería funcionar:

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

No estoy familiarizado con la plantilla JDBC de primavera, pero sustituyendo los valores reales en la consulta select ... from dual por el parámetro los marcadores de posición deberían funcionar.

+0

Gracias esto casi funciona. El único problema que queda es que no puedo actualizar ** pr.code ** porque me estoy refiriendo a él en la cláusula ** ON **: 'on (pr.id = t.id o pr.code = t.code)' . Esto no es un problema si ingreso la actualización con 'pr.code = t.code', pero si la ingreso con' pr.id = t.id' ** pr.code ** debe actualizarse. – ollo

+0

¿Por qué? ¿Es esta restricción en la cláusula de fusión de todos modos ..? – ollo

Cuestiones relacionadas