立即执行…捕获特定于记录的异常



我从Table1中插入一些值到Table2。有可能存在主键碰撞。我使用EXECUTE IMMEDIATE将值从Table1插入到Table2

记录可以以百万计,并且只有一次提交,即

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

是否有一种方法,我可以记录导致主键碰撞的异常块的确切行?

我知道我可以使用"批量"插入和"保存异常"方法,但由于一些复杂的原因,我现在不允许改变这个东西的脚本。

有什么建议吗?

您可以执行部分插入操作并在错误日志中捕获错误,而不是完全失败

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                                                                                                                                                                                            

试着使用以下命令:

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

分享快乐。

相关内容

  • 没有找到相关文章

最新更新