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.
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 –
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
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