web-dev-qa-db-ja.com

一意制約違反を引き起こす値をログに記録する方法

Oracleで実行されている長いINSERTステートメントが失敗します。

ORA-00001: unique constraint (MYPROJECT.MYTABLE_PK) violated

制約は次のとおりです。

CONSTRAINT "MYTABLE_PK" PRIMARY KEY ("ENCOUNTER_NUM", "CONCEPT_CD", "PROVIDER_ID", "START_DATE", "MODIFIER_CD")

問題のあるINSERTステートメントはログに記録されますが、制約違反の原因となった値はログに記録されません。

制約に違反した値をログに記録するか、保存して表示する方法はありますか?

これは、Oracle Database 11g Enterprise Editionリリース11.2.0.3.0-64ビット本番です

6
Chris Gentle

DML error logging を使用できます

begin
  dbms_errlog.create_error_log( dml_table_name => 'MYTABLE' );
end;
/

insert into mytable
  <<your select statement>>
  log errors into err$mytable
  reject limit unlimited;

これにより、err$mytableテーブルへの制約に違反したすべての行がログに記録されます。

5
Justin Cave