调试Oracle批量DML错误 - 如何确定哪个值导致错误?

时间:2011-11-16 20:14:20

标签: oracle error-handling plsql oracle10g bulkinsert

我正在尝试调试在一个环境中发生的DML错误,而不是其他环境。设置如下:

我有大约10套DML操作(从远程表批量获取,批量插入到本地表),其中两个给出DML错误,“无效数字”的味道,另一个是“PL / SQL:数字或值错误:批量绑定:截断绑定“。

我尝试将数据复制到“良好”环境,但无法重现相同的错误。所以我现在正在尝试构建一个更强大的错误处理程序来捕获这些错误处理程序,并帮助确定哪个数据块给我带来了问题。

我看起来像这样:

...
loop
    fetch c_some_data bulk collect into v_arr limit v_limit_size;

    forall i in 1..v_arr.count SAVE EXCEPTIONS
    insert into table_abc_1 values v_arr(i);
    exit when c_some_data%notfound;
end loop;
...
exception
    when X_DML_ERRORS then
        declare
            j integer;
        begin
            FOR j IN 1 .. SQL%BULK_EXCEPTIONS.COUNT LOOP
                begin
                   /*only print the KEY fields for this table,
                   this table has (I think) close to 20 fields*/
                   dbms_output.put_line('DML Bulk-operation error: ' ||
                                                         ' Error Code: '||SQLERRM(-SQL%BULK_EXCEPTIONS(j).ERROR_CODE)||'; '||
                                                         v_arr(SQL%BULK_EXCEPTIONS(j).ERROR_INDEX).stage||'; '||
                                                         v_arr(SQL%BULK_EXCEPTIONS(j).ERROR_INDEX).id||'; '||
                                                         v_arr(SQL%BULK_EXCEPTIONS(j).ERROR_INDEX).code||'; ')

                end;

            end loop;
        end;
    when others then
        PKG_EXCPTN.sp_generic_exception_handler;
end;

我确信我可以打印所有列,但表格很大(有些列数> 20列),并且有10个代码块可能会出现此问题。它还需要有人查看消息中的每个值,看它是否与列类型匹配(varchar2与数字)。

是否有一种简单的方法可以打印出现错误的字段和导致错误的值?

(使用Oracle 10g)

1 个答案:

答案 0 :(得分:3)

您可以在DML语句中使用LOG ERRORS INTO,这样您就可以将错误和错误数据转储到表中,以便以后查看。

请参阅:http://www.oracle-developer.net/display.php?id=329

和:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_9014.htm#BGBDIGAH