8

bar使用类型的变量,foo%ROWTYPE我可以在 PL/SQL 中INSERT同时执行以下操作:UPDATE

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

但是我该怎么做MERGE?以下方法会生成以下错误消息:

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-00942: 表或视图不存在

4

1 回答 1

4

MichaelS 在上面提到的线程中给出的答案应该可以正常工作。您收到的错误消息(ORA-38104:无法更新 ON 子句中引用的列:foo.id)表明您正在尝试执行类似于以下的操作:

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;

由于错误状态,“ON”子句中引用的列无法更新。因此,以下将正常工作:

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;

如果你真的需要更新 foo.id,这里有一个可能的解决方案:How to Avoid ORA-3814 error on merge?

编辑

一种可能的替代方法是执行以下操作:

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

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

这应该基本上等同于做与合并语句相同的事情。

于 2015-12-15T16:38:46.740 回答