2011-10-25 40 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

相關問題