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

调试Oracle批量DML错误-如何确定导致错误的值?,oracle,error-handling,plsql,oracle10g,bulkinsert,Oracle,Error Handling,Plsql,Oracle10g,Bulkinsert,我正在尝试调试一个DML错误,该错误发生在一个环境中,而不是其他环境中。设置如下: 我有大约10组DML操作(从远程表大容量获取,大容量插入本地表),其中两组给出DML错误,“无效数字”味道,另一组是“PL/SQL:数值或值错误:大容量绑定:截断绑定” 我试图将数据复制到“良好”的环境中,但无法再现相同的错误。因此,我现在正试图构建一个更健壮的错误处理程序来捕获这些错误,并帮助确定哪段数据给我带来了问题 我所拥有的是这样的: ... loop fetch c_some_data bulk

我正在尝试调试一个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 vs.number)

是否有一种简单的方法来打印发生错误的字段和导致错误的值


(使用Oracle 10g)

您可以在DML语句中使用LOG ERRORS to,这将允许您将错误和坏数据转储到表中,以便以后检查它们

见:


而且:

很有趣。。。这将告诉我哪个字段中的哪个值导致了问题?我以前从未听说过这个功能。看起来它创建了一个新的loggin表。。。我得和DBA谈谈,看看他对这件事是否满意。看起来我还必须用一个循环替换当前的
for all…insert
,循环中包含常规的
insert
语句,对吗?代码最初是用
for all…insert
编写的,因为它处理的卷相当大,性能也是一个问题。嗯,所以我只是尝试使用没有表名的
日志错误
(应该转到一个新的默认表,如指定的那样,对吗?),编译时出现“表或视图不存在”错误。嗯?好吧,我知道了。。。必须先在单独的脚本中调用函数来创建表。。。现在我从DBMS_ERRLOG中得到一个“权限不足”错误。。。ugh.@fructedWithFormsDesigner尝试创建一个表,顺便说一句,DML错误日志在
FORALL
中运行良好。我能够自己创建表并使其工作。它看起来并没有隔离哪些值会导致无效数字(或其他DML)错误,但它仍然使记录信息比手动dbms_输出每个表、列和值容易得多。谢谢