【问题标题】:What is cause of ORA-38104 error on SQL merge?SQL 合并时出现 ORA-38104 错误的原因是什么?
【发布时间】:2011-12-14 18:33:43
【问题描述】:

我有这样的代码

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。我了解此错误的原因。但是我们如何重写这段代码呢?不使用光标有什么可能吗?

【问题讨论】:

    标签: oracle merge ora-38104


    【解决方案1】:

    这个怎么样,外连接意味着rid 将是空的,因此会失败,所以如果你有的话,流入语句的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
    

    【讨论】:

    • 如果我使用这个查询,我会收到这个错误ORA-01445-cannot select ROWID from a join view without a key-preserved table Cause: A SELECT statement attempted to select ROWIDs from a view derived from a join operation. Because the rows selected in the view do not correspond to underlying physical records, no ROWIDs can be returned.
    • 你一定是在做一些稍微不同的事情。你确定你有t2.ROWID AS something?使用src.ROWID 是无效的,这就是为什么我将它命名为AS rid
    • 是的,你是对的。我错过了将t2.ROWID 重命名为rid。添加别名后它工作正常。谢谢你 Sodved :)
    • 这很棒但是,它在更新时对我有用,但是当我尝试使用“当不匹配时”语句时没有插入任何行。请帮帮我。我也尝试使用 src.name 来插入几列,同样用于列。即使不匹配,它仍然说合并了 0 行。如果我能在这里得到一些帮助,那将是一个很大的帮助。
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2020-12-10
      • 2019-03-11
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多