Продолжение вставки из оператора select при возникновении ошибки - PullRequest
0 голосов
/ 18 марта 2019

Может ли кто-нибудь помочь мне продолжить оператор INSERT INTO ... SELECT FROM при возникновении ошибки?Заранее спасибо.

Пример сценария SQL:

insert into tab1
select id, name from tab2

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

если у вас есть уникальный ключ в целевой таблице и у вас нет исходной таблицы, то может произойти ошибка при вставке из-за повторяющихся значений

с подсказкой ignore_row_on_dupkey_index,Вы можете игнорировать ошибки.

Вот пример, если в вашей таблице есть ключ Uniq на ИД.unique_index_name - это имя уникального индекса в вашей целевой таблице

insert /*+ ignore_row_on_dupkey_index(tab1, unique_index_name) */
  into tab1
( select * from tab2);

, в качестве альтернативы вы можете посмотреть на оператор слияния, который может выглядеть так, чтобы игнорировать ошибки

merge into tab2 a
 using tab1 b
    on (a.id = b.id)
  when not matched then
    insert (id,n)
    values (b.id, b.n)
log errors into ERR$_tab2 REJECT LIMIT UNLIMITED;

;

Все ошибки будут записаны в таблицу ошибок, которую вы должны сгенерировать ранее.Вы можете сделать это, например, как

call DBMS_ERRLOG.CREATE_ERROR_LOG (dml_table_name  => 'tab2);  

ERR$_tab2 будет таблица ошибок

0 голосов
/ 18 марта 2019

Пожалуйста, попробуйте это.

INSERT INTO tab1 (id,name) SELECT id, name from tab2
...