我正在尝试将记录插入表中(如果该记录尚不存在)。 如果确实存在,我希望它进行更新。
我看到其他人张贴的这个例子:
MERGE INTO mytable d
USING (SELECT 1 id, 'x' name from dual) s
ON (d.id = s.id)
WHEN MATCHED THEN UPDATE SET d.name = s.name
WHEN NOT MATCHED THEN INSERT (id, name) VALUES (s.id, s.name);
我当前的存储过程如下:
procedure savePublicId(P_ACCNO in varchar2, P_PUBLICID in varchar2) is
begin
update cc_custprofiles cpr
set cpr.publicid = P_PUBLICID
where cpr.customerlong_cpr = 'C'||P_ACCNO
and key_cpr = 'SINGLE';
commit;
end;
此表中没有标识列(我知道...),因此无法进行捕获。
我试图更改该merge
以匹配我的表结构,但是我是Oracle新手,所以不太确定自己在做什么:D
我想出了这个
merge into cc_custprofiles cpr
using (select 1 customerlong_cpr, 'x' publicid, 'SINGLE' key_cpr from dual) dual
on (cpr.customerlong_cpr = dual.customerlong_cpr)
when matched then update set cpr.publicid = P_PUBLICID
WHEN NOT MATCHED THEN INSERT (customerlong_cpr, publicid, key_cpr) values (P_ACCNO, P_PUBLICID, 'SINGLE');
但是我认为那是不对的。有人可以帮我吗?
答案 0 :(得分:2)
您的merge语句将近存在。我认为您正在追求类似这样的东西:
MERGE INTO cc_custprofiles tgt
USING (SELECT 'C' || p_accno customerlong_cpr,
p_publicid publicid,
'SINGLE' key_cpr
FROM dual) src
ON (tgt.customerlong_cpr = src.customerlong_cpr AND tgt.key_cpr = src.key_cpr)
WHEN MATCHED THEN
UPDATE SET tgt.publicid = src.publicid
WHEN NOT MATCHED THEN
INSERT (tgt.customerlong_cpr, tgt.publicid, tgt.key_cpr)
VALUES (src.customerlong_cpr, src.publicid, src.key_cpr);
merge语句的目的是从源表或子查询中获取结果,并决定是在目标表中插入还是更新它们。在您的情况下,由于要使用参数来决定要插入的内容,因此需要将它们放入select ... from dual
子查询中,以便可以将其用作merge语句中的源子查询。
您的连接条件(也称为ON
子句)是您用来标识行的谓词-在您的情况下,看起来是:
where cpr.customerlong_cpr = 'C'||P_ACCNO
and key_cpr = 'SINGLE';
来自您的更新声明。
然后只需根据需要更新或插入相关值即可。
我总是分别使用tgt
和src
作为目标表和源表/子查询的别名。我发现这有助于我在编写查询时保持头脑清醒。您可能会或可能不会觉得此约定有用。