立即执行...捕获记录特定异常

Posted

技术标签:

【中文标题】立即执行...捕获记录特定异常【英文标题】:Execute immediate ... Catching record specific exception 【发布时间】:2013-05-29 16:42:48 【问题描述】:

我在Table2 中插入一些来自Table1 的值。可能存在主键冲突。我正在使用EXECUTE IMMEDIATE 将值从Table1 插入到Table2

记录可能以百万为单位,并且只有 1 次提交,即,

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

有没有一种方法可以记录导致异常块中主键冲突的确切行?

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

有什么建议吗?

【问题讨论】:

尝试使用以下方法:DBMS_OUTPUT.PUT_LINE('SQLCODE=' || to_char(SQLCODE) || ' Error=''' || DBMS_UTILITY.FORMAT_ERROR_STACK || ''' Backtrace=''' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE || ''''. 你能把它作为答案让我接受吗? 【参考方案1】:

您可以执行部分​​插入并在错误日志中捕获错误,而不是完全失败,如该问题的答案中所述

Oracle INSERT INTO SELECT(...) DUP_VAL_ON_INDEX exception behavior

我也不知道你为什么要写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                                                                                                                                                                                            

【讨论】:

【参考方案2】:

尝试使用以下方法:

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

分享和享受。

【讨论】:

以上是关于立即执行...捕获记录特定异常的主要内容,如果未能解决你的问题,请参考以下文章

Atitit mysql 存储过程捕获所有异常,以及日志记录异常信息

如何记录“捕获的”异常?

Python学习记录-异常捕获

JDBC 批量插入异常处理以了解特定的失败记录

Python自动化测试之异常处理机制实例详解

捕获引擎执行异常