您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2026/2/3 18:14:41发布17次查看
快速的定位错误数据和报错语句是我们提高工作效率的关键。本篇介绍使用oracle的event,
在实际应用开发中,我们有很多精力倾注在调试程序和异常情况的排查上。使用设计逻辑和场景开发的代码,经常被生产数据一次次的“攻破”。快速的定位错误数据和报错语句是我们提高工作效率的关键。本篇介绍使用oracle的event, 'error'); error stack方法来定位程序包中报错的sql和取值。
1、场景展现
我们选择oracle 11g来进行试验。
sql> select * from v$version where rownum
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.count0) 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的诊断事件方法来进行定位。
相关阅读:
spfile 错误导致数据库无法启动(ora-01565)
ora-01172、ora-01151错误处理
ora-00600 [2662]错误解决
ora-01078 和 lrm-00109 报错解决方法
更多详情请继续阅读第2页的精彩内容:
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product