gpt4 book ai didi

oracle - 在 Oracle 上的 PL/SQL 中使用行类型变量合并?

转载 作者:行者123 更新时间:2023-12-04 08:33:34 24 4
gpt4 key购买 nike

带有变量 bar类型 foo%ROWTYPE我两者都可以做 INSERTUPDATE在 PL/SQL 中:

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;

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

关于oracle - 在 Oracle 上的 PL/SQL 中使用行类型变量合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33741162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com