2012-04-13 37 views
5

Tôi đang sử dụng SQL JDBC và SQL oracle.Tuyên bố hợp nhất Oracle SQL với chỉ 1 bảng và một loạt các giá trị

sử dụng lớp SpringJDBC MapSqlParameterSource, tôi đã ánh xạ dữ liệu tôi muốn hợp nhất.

Bây giờ tôi muốn sử dụng câu lệnh hợp nhất để cập nhật/chèn bảng cơ sở dữ liệu. Tất cả tôi có là một bảng và một loạt các thông số tôi muốn hợp nhất vào nó.

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

Do i phải bằng cách nào đó tạo ra một bảng tạm thời cho sử dụng từ khóa hoặc là có cách khác? làm thế nào tôi sẽ đi về sáp nhập như thế này?

cũng có hai khóa duy nhất là pr.id và pr.code. Đôi khi tham số : idnull, khi điều này xảy ra, tôi muốn tiếp cận câu lệnh cập nhật dựa trên pr.code được khớp với: mã. Sẽ nó vẫn có tác dụng nếu bản cập nhật của tôi chứa dòng:

update set pr.code    = :code, 
+0

Bạn đang gặp phải vấn đề gì? – Teja

+0

Từ khóa: "sử dụng (! Thông số nên đi ở đây bằng cách nào đó?)". Tôi có phải tạo một bảng tạm thời bằng cách nào đó và đặt nó sau khi sử dụng hoặc là có một số cách khác để có được giá trị của tôi vào câu kết hợp này. Và nếu không có cách nào khác, làm thế nào để tôi thực hiện một bảng tạm thời? – ollo

+0

Bạn không cần bất kỳ bảng tạm thời nào ... Hãy kiểm tra liên kết này để biết cú pháp hợp nhất.http: //docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm – Teja

Trả lời

5

này nên làm việc:

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

Tôi không quen thuộc với mẫu JDBC Spring, nhưng thay thế các giá trị thực tế trong truy vấn select ... from dual bởi tham số trình giữ chỗ phải hoạt động.

+0

Cảm ơn điều này gần như hoạt động. Vấn đề duy nhất còn lại là tôi không thể cập nhật ** pr.code ** vì im tham chiếu nó trong mệnh đề ** ON **: 'on (pr.id = t.id hoặc pr.code = t.code)' . Đây không phải là vấn đề nếu tôi nhập bản cập nhật với 'pr.code = t.code', nhưng nếu tôi nhập nó với' pr.id = t.id' ** pr.code ** cần được cập nhật .. – ollo

+0

là ràng buộc này trên mệnh đề hợp nhất dù sao ..? – ollo

Các vấn đề liên quan