1

MERGEを使用したPL/SQLプロシージャがあります:

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ステートメントでそれを使用する方法は?

前もって感謝します

4

2 に答える 2

4

別のステートメントでごみ箱テーブルへの重複行のアーカイブを処理してみませんか?

まず、マージを実行します(一意の制約エラーを回避するために重複する行を集約します)。MAXcol1で集計関数を想定しましたが、ニーズに合ったものを使用できます。重複がある場合に使用する行を決定する方法を指定していません。

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)

うまくいけば、それはあなたのニーズを満たすはずです。

于 2010-08-30T12:27:23.693 に答える
2

エラーロギング句を使用することはできませんか?IE、MERGEステートメントの最後に次の行を追加します。

LOG ERRORS INTO my_Table_recycledbin
于 2010-08-30T13:36:16.483 に答える