在 Oracle 上使用 PL/SQL 中的行类型变量进行 MERGE?
MERGE using a rowtype variable in PL/SQL on Oracle?
使用 foo%ROWTYPE
类型的变量 bar
我可以在 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: table or view does not exist
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;
这基本上等同于执行与合并语句相同的操作。
使用 foo%ROWTYPE
类型的变量 bar
我可以在 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: table or view does not exist
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;
这基本上等同于执行与合并语句相同的操作。