2010-08-30 68 views
0

我有一個PL/SQL程序使用MERGE:MERGE - 如果不匹配INSERT的異常

MERGE INTO 
    table_dest d 
USING 
    (SELECT * FROM my_Table) s 
ON 
    (s.id = d.id) 
when matched  then UPDATE set d.col1 = s.col1 
when not matched then INSERT (id, col1) values (s.id, s.col1); 

現在可以說s返回多發性行用相同的ID至極的意願返回ORA-00001查詢:獨特的約束錯誤

我想要做的就是複製的列發送到另一臺my_Table_recyledbin獲得成功的INSERT,我可以使用EXCEPTION WHEN DUP_VAL_ON_INDEX?如果是的話如何與MERGE語句一起使用?

在此先感謝

回答

2

爲什麼不處理重複的行到回收站表的歸檔在一個單獨的聲明?

首先,做你的合併(聚合重複行以避免唯一約束錯誤)。我已經在col1上假設了一個MAX集合函數,但是您可以使用任何適合您需要的函數 - 您沒有指定如何在存在重複項時決定使用哪一行。

MERGE INTO 
    table_dest d 
USING 
    (SELECT a.id, MAX(a.col1) as col1 
    FROM my_Table a 
    GROUP BY a.id) s 
ON 
    (s.id = d.id) 
WHEN MATCHED THEN UPDATE SET d.col1 = s.col1 
WHEN NOT MATCHED THEN INSERT (id, col1) VALUES (s.id, s.col1); 

然後,處理重複的行。我假設您的回收站表格確實允許插入重複的ID:

INSERT INTO my_Table_recyledbin r (id, col1) 
SELECT s.id, s.col1 
    FROM my_Table s 
WHERE EXISTS (SELECT 1 
       FROM my_Table t 
       WHERE t.id = s.id 
        AND t.ROWID != s.ROWID) 

希望這可以滿足您的需求。

+0

謝謝湯姆這真的很有幫助,我現在就試試吧! – mcha 2010-08-30 13:00:42

+0

@mcha很高興幫助,讓我知道它是如何工作的。 – Tom 2010-08-31 22:27:58

+0

其完美的工作! thx – mcha 2010-09-01 14:18:02

1

難道你不能只使用錯誤記錄子句嗎? I.E.,在你的MERGE聲明結尾加上這一行:

LOG ERRORS INTO my_Table_recycledbin 
+0

謝謝戴夫,我不知道關於LOG錯誤,我正在讀它,不幸的是它說: >在以下情況下不會調用DML錯誤日誌功能: - UPDATE或** MERGE **操作引發**唯一約束或索引違規**。 – mcha 2010-08-31 11:06:07