MERGE - когда не совпадает исключение INSERT - PullRequest
1 голос
/ 30 августа 2010

у меня есть процедура PL / SQL, использующая MERGE:

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 возвращает несколько строк с одинаковым идентификатором, которые возвращают ORA-00001: уникальная ошибка ограничения

что я хочу сделать, это отправить дублированные столбцы в другую таблицу my_Table_recyledbin , чтобы получить успешную INSERT, могу ли я использовать EXCEPTION WHEN DUP_VAL_ON_INDEX?если да, то как использовать его с оператором MERGE?

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 30 августа 2010

Почему бы не обработать архивирование повторяющихся строк в таблице корзины в отдельном операторе?

Во-первых, сделайте слияние (объединяя дублирующиеся строки, чтобы избежать уникальной ошибки ограничения). Я предположил MAX агрегатную функцию для столбца col1, но вы можете использовать все, что вам подходит - вы не указали, как решить, какую строку использовать при наличии дубликатов.

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);

Затем разберитесь с дублирующимися строками. Я предполагаю, что ваша таблица корзины позволяет вставлять повторяющиеся идентификаторы:

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)

Надеюсь, это должно удовлетворить ваши потребности.

2 голосов
/ 30 августа 2010

Разве вы не можете просто использовать пункт регистрации ошибок? И.Е., добавьте эту строку в конце вашего утверждения MERGE:

LOG ERRORS INTO my_Table_recycledbin
...