2011-10-25 39 views
3

我有这样如何避免合并时出现ORA-3814错误?

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代码。我明白这个错误的原因。但是,我们如何重写这段代码呢?有没有使用光标的可能性?

回答

11

这个怎么样,外部联接意味着rid将是无效,因此失败,所以流入,如果你有一个

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 
+0

我得到这个错误'语句的WHEN NOT MATCHED部分ORA- 01445-无法从连接视图中选择ROWID而没有键保存表原因:SELECT语句试图从连接操作派生的视图中选择ROWID。由于在视图中选择的行不对应于基础物理记录,因此不能返回ROWID。 '如果我使用这个查询 – Vivek

+1

你必须做些稍微不同的事情。你确定你有'T2.ROWID AS''吗?使用'src.ROWID'是不合法的,这就是为什么我用别名'AS rid' – Sodved

+0

是的,你是对的。我错过了将't2.ROWID'重命名为'rid'。它在我添加别名后工作正常。谢谢深深地暗示:) – Vivek

相关问题