2015-11-16 16 views
6

Với một biến bar loại foo%ROWTYPE tôi có thể làm cả hai INSERTUPDATE trong PL/SQL:MERGE sử dụng biến rowtype trong PL/SQL trên Oracle?

INSERT INTO foo VALUES bar; 
UPDATE foo SET ROW = bar WHERE id = bar.id; 

Nhưng làm thế nào để làm một MERGE? Các phương pháp sau đây tạo ra các thông báo lỗi dưới đây:

MERGE INTO foo USING bar ON foo.id = bar.id 
WHEN MATCHED THEN UPDATE SET ROW = bar 
WHEN NOT MATCHED THEN INSERT VALUES bar; 

PL/SQL: ORA-00.942: bảng hoặc xem không tồn tại

+1

tin rằng điều này đã được trả lời trên diễn đàn oracle tại đây https://community.oracle.com/thread/621511?start=0&tstart=0 xem câu trả lời của Solomon. Ngoài ra còn có một FORALL Merge có thể làm việc cho bạn. http://www.morganslibrary.org/reference/plsql/array_processing.html –

+0

Cảm ơn bạn đã trả lời. Solomons câu trả lời là liệt kê tất cả các lĩnh vực của rowtype, mà loại mất đi toàn bộ các điểm của việc sử dụng một rowtype. Tôi không chắc tôi hiểu cách 'FORALL MERGE' sẽ giúp ích gì ở đây. Tuy nhiên, giải pháp từ MichaelS có vẻ hứa hẹn. – Anders

+0

Không, không thể nhận được MichaelS trả lời để làm việc. Tôi chỉ nhận được 'ORA-38104: Cột được tham chiếu trong Điều khoản ON không thể được cập nhật: foo.id' – Anders

Trả lời

2

Câu trả lời Michaels cho trong các chủ đề nêu trên sẽ làm việc tốt . Các thông báo lỗi bạn nhận được (ORA-38.104: Cột tham chiếu trong khoản ON không thể được cập nhật: foo.id) cho thấy bạn đang cố gắng làm điều gì đó tương tự như sau:

merge into foo 
    using (select null from dual) 
    on (foo.id = bar.id) 
    when matched then update set foo.id = bar.id, foo.another_field = bar.another_field 
    when not matched then insert VALUES bar; 

Theo các tiểu bang lỗi , các cột được tham chiếu trong mệnh đề "BẬT" không thể cập nhật được. Như vậy, sau đây sẽ làm việc tốt:

merge into foo 
    using (select null from dual) 
    on (foo.id = bar.id) 
    when matched then update set foo.another_field = bar.another_field 
    when not matched then insert VALUES bar; 

Nếu bạn thực sự cần phải cập nhật foo.id, có một giải pháp khả thi ở đây: How to avoid ORA-3814 error on merge?

Sửa

Một thay thế có thể sẽ là để thực hiện các việc sau:

update foo set row = bar where foo.id = bar.id; 

if sql%rowcount = 0 then 
    insert into foo values bar; 
end if; 

Điều này về cơ bản nên tương đương để thực hiện tương tự như khi hợp nhất tatement.

+0

Trừ khi bạn thực sự cần phải sử dụng một tuyên bố hợp nhất vì lý do nào đó, tôi đã thêm một giải pháp thay thế có thể cho bạn. Như đã nêu bởi Solomon Yakobson (https://community.oracle.com/thread/621511?start=0&tstart=0), bạn không thể sử dụng một rowtype trong mệnh đề khi kết hợp của một câu lệnh merge – Chrisrs2292

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