调试Oracle批量DML错误-如何确定导致错误的值?
我正在尝试调试一个DML错误,该错误发生在一个环境中,而不是其他环境中。设置如下: 我有大约10组DML操作(从远程表大容量获取,大容量插入本地表),其中两组给出DML错误,“无效数字”味道,另一组是“PL/SQL:数值或值错误:大容量绑定:截断绑定” 我试图将数据复制到“良好”的环境中,但无法再现相同的错误。因此,我现在正试图构建一个更健壮的错误处理程序来捕获这些错误,并帮助确定哪段数据给我带来了问题 我所拥有的是这样的:调试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
...
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_输出每个表、列和值容易得多。谢谢