この質問への回答で説明されているように、まったく失敗する代わりに、部分的な挿入を実行してエラーログにエラーをキャプチャすることができます
Oracle INSERT INTO SELECT(...) DUP_VAL_ON_INDEX 例外の動作
また、なぜあなたがしたいのかわからないexecute immediate
。しかし、上記は単なる例であり、これを動的に実行したい場合があります。あなたは私の実験からそれを解決することができます:
create table table1 (mycolumn varchar2(200));
create table table2 (mycolumn varchar2(200));
exec DBMS_ERRLOG.create_error_log (dml_table_name => 'table2');
create unique index table2_i1 on table2 (mycolumn);
insert into table1 values ('one thing');
insert into table1 values ('another thing');
insert into table1 values ('another thing');
INSERT INTO table2
SELECT * FROM table1
LOG ERRORS INTO err$_table2 ('INSERT') REJECT LIMIT UNLIMITED;
commit;
select * from err$_table2;
select * from table2;
出力
table TABLE1 created.
table TABLE2 created.
anonymous block completed
unique index TABLE2_I1 created.
1 rows inserted.
1 rows inserted.
1 rows inserted.
2 rows inserted.
committed.
ORA_ERR_NUMBER$ ORA_ERR_MESG$ ORA_ERR_ROWID$ ORA_ERR_OPTYP$ ORA_ERR_TAG$ MYCOLUMN
--------------- --------------------------------------------------------------------------
1 ORA-00001: unique constraint (SYS.TABLE2_I1) violated I INSERT another thing
MYCOLUMN
--------------
one thing
another thing