0

Table2fromにいくつかの値を挿入していますTable1。主キーの競合が発生する可能性があります。からにEXECUTE IMMEDIATE値を挿入するために使用しています。Table1Table2

レコードは数百万になる可能性があり、コミットは 1 つだけです。つまり、

    execute immediate 'insert into table 2 (select * from table 1)';
    delete from table1;
    commit;
EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
     ROLLBACK;
     --LOGGING

例外ブロックで主キーの衝突を引き起こした正確な行をログに記録できる方法はありますか?

「一括」挿入と「例外保存」メソッドを使用できることはわかっていますが、いくつかの複雑な理由により、現在、このスクリプトを変更することは許可されていません。

助言がありますか ?

4

2 に答える 2

2

この質問への回答で説明されているように、まったく失敗する代わりに、部分的な挿入を実行してエラーログにエラーをキャプチャすることができます

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                                                                                                                                                                                            
于 2013-05-30T20:33:26.093 に答える
0

以下を使用してみてください。

DBMS_OUTPUT.PUT_LINE('SQLCODE=' || to_char(SQLCODE) ||
                     ' Error=''' || DBMS_UTILITY.FORMAT_ERROR_STACK ||
                     ''' Backtrace=''' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE ||
                     '''');

共有してお楽しみください。

于 2013-05-29T23:44:36.160 に答える