我有这样的代码
MERGE INTO target_table tgt
USING source_table src
on(tgt.c1=src.c1)
WHEN MATCHED THEN
UPDATE SET tgt.c1=src.c2
我得到ORA-38104: Columns referenced in the ON clause cannot be updated
。我理解这个错误的原因。但是我们怎样才能重写这段代码呢?没有使用光标有没有可能吗?
答案 0 :(得分:11)
这个怎么样,外连接意味着rid
将为null并因此失败,因此如果你有一个
WHEN NOT MATCHED
部分
MERGE INTO target_table tgt
USING ( SELECT t2.ROWID AS rid
, s2.c2
FROM target_table t2
, source_table s2
WHERE t2.c1 (+) = s2.c1
) src
ON (tgt.rowid = src.rid)
WHEN MATCHED THEN
UPDATE SET tgt.c1=src.c2
答案 1 :(得分:0)
You can exploit some workarounds for ORA-38104,它似乎可以工作到Oracle 18c(包括该版本)为止,在该版本中,您将列包装在包含附加虚拟表达式的行值表达式中:
MERGE INTO target_table tgt
USING source_table src
ON ((tgt.c1, 'dummy') = ((src.c1, 'dummy')))
WHEN MATCHED THEN
UPDATE SET tgt.c1=src.c2