2012-04-13 7 views
5

Używam Spring JDBC i Oracle SQL.Wyjaśnienie SQL Merge z tylko jedną tabelą i garść wartości

przy użyciu klasy SpringJDBC MapSqlParameterSource, mapowałem dane, które chcę scalić.

Teraz chcę użyć instrukcji merge do aktualizacji/wstawienia tabeli bazy danych. Wszystko, co mam, to jedna tabela i kilka parametrów, które chcę scalić.

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

muszę jakoś utworzyć tabelę tymczasową dla użyciu słowa kluczowego lub jest jakiś inny sposób? jak mógłbym się tak scalić?

Istnieją również dwa unikatowe klucze pr.id i pr.code. Czasami parametr : id jest null, gdy tak się stanie chcę osiągnąć instrukcję aktualizacji opartą na kod pr.code dopasowywanym do: code. Będzie nadal działać, jeśli mój aktualizacja zawiera linię:

update set pr.code    = :code, 
+0

Z jakim problemem stoisz? – Teja

+0

Słowo kluczowe: "używając (! Parametry powinny tu jakoś pójść?)". Czy muszę w jakiś sposób utworzyć tabelę tymczasową i umieścić ją po użyciu lub jest jakiś inny sposób, aby uzyskać moje wartości w tym zdaniu scalającym. A jeśli nie ma innego sposobu, jak zrobić tabelę tymczasową? – ollo

+0

Nie potrzebujesz żadnej tabeli tymczasowej ... Sprawdź ten link, aby uzyskać składnię łączenia.http: //docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm – Teja

Odpowiedz

5

To powinno działać:

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

nie jestem zaznajomiony z szablonu JDBC sprężyny, ale zastępując rzeczywiste wartości w zapytaniu select ... from dual parametrem placeholders powinny działać.

+0

Dzięki temu prawie działa. Jedyny problem, który pozostaje, to że nie mogę zaktualizować ** pr.code **, ponieważ im odwołuje go w klauzuli ** ON **: on (pr.id = t.id lub pr.code = t.code) . To nie jest problem, jeśli wprowadzę aktualizację z 'pr.code = t.code', ale jeśli wprowadzę ją z' pr.id = t.id' ** pr.code ** musi zostać zaktualizowany .. – ollo

+0

Dlaczego czy to ograniczenie na klauzulę scalania mimo wszystko ...? – ollo

Powiązane problemy