使用error stack诊断特定错误信息

2014-11-24 17:46:40 · 作者: · 浏览: 0

1、场景展现


我们选择Oracle 11g来进行试验。


SQL> select * from v$version where rownum<3;


BANNER


--------------------------------------------------------------------------------


Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production


PL/SQL Release 11.2.0.1.0 – Production


数据表T包括object_id和object_name列。其中object_id为主键列。


SQL> create table t (object_id number, object_name varchar2(100));


Table created


SQL> alter table t add constraint pk_t primary key (object_id);


Table altered


灌入一部分基础数据,作为原始值。


SQL> insert into t select object_id, object_name from dba_objects where wner='SCOTT';


20 rows inserted


SQL> commit;


Commit complete


为了进行实验,我们创建一个procedure程序段,从dba_objects中选取数据插入到数据表T中。程序定义如下:


SQL> create or replace procedure P_ERRORSTACK_TEST


2 is


3 type t_objs_list is table of dba_objects%rowtype index by binary_integer;


4 t_obj_infos t_objs_list;


5 begin


6 select *


7 bulk collect into t_obj_infos


8 from dba_objects;


9


10 if (t_obj_infos.count<>0) then


11 for i in t_obj_infos.first..t_obj_infos.last loop


12 insert into t


13 values (t_obj_infos(i).object_id, t_obj_infos(i).object_name);


14 end loop;


15 end if;


16 end P_ERRORSTACK_TEST;


17 /


Procedure created


注意三个细节:首先,我们是逐条进行数据的插入动作的,而不是insert into select方式。第二,我们在for循环里面插入数据,循环次数多,实际上不能逐条进行检查判断。第三,我们插入的是dba_objects所有的数据,必然一部分插入数据和原始数据表中存在主键冲突的情况。


实际执行中,报错。


SQL> exec P_ERRORSTACK_TEST;


begin P_ERRORSTACK_TEST; end;


ORA-00001:违反唯一约束条件(SCOTT.PK_T)


ORA-06512:在"SCOTT.P_ERRORSTACK_TEST", line 12


ORA-06512:在line 1


有过调试和测试经验的朋友们非常熟悉这样的情景。大批量数据测试的时候,存储过程作业包括成千上万相同或者不同的SQL,执行数据海量。执行半天之后,报错。类似的错误还有如长度(数字字符串)超过限制、将空值null插入到非空约束字段,违反外键约束等等。


这样的原因无非几种,一是程序的Bug,开发人员没有考虑到业务场景,一般出现在null值计算结果null上。其二是设计问题,业务人员和设计人员没有考虑到当前这样的异常场景。最后也是比较麻烦的,就是测试数据来源有问题,需要进行额外清理工作。


无论原因是上述哪种,有两件事情是必须做到,是哪句SQL报错,报错的数据参数值是什么。


当然,我们可以认为加入调试代码来输入执行过程,从而实现定位。我们更方便的是使用error stack的诊断事件方法来进行定位。


相关阅读: