+ -
当前位置:首页 → 问答吧 → 分享一个错误精确定位工具

分享一个错误精确定位工具

时间:2011-09-10

来源:互联网

该工具主要用于定位过程、函数等报错时的错误信息以及出错的行,比使用sqlerrm方便快捷得多。
不出错时p_call_info也可以记录过程的调用信息。
支持10g以上版本。

代码如下:
create or replace procedure p_parse_stack_info
(
  p_owner       out varchar2,  --max length 30
  p_object_name out varchar2,  --max length 30
  p_call_info   out varchar2,  --max length 2000
  p_error_info  out varchar2,  --max length 2000
  p_trace_info  out varchar2   --max length 2000
)
as
  v_str        varchar2(2000);
  v_cnt        number;
begin
  p_call_info  := dbms_utility.format_call_stack;
  p_error_info := dbms_utility.format_error_stack;
  p_trace_info := substrb(dbms_utility.format_error_backtrace, 1, 2000);
  
  p_call_info := substr(p_call_info, instr(p_call_info, chr(10), 1, 4) + 1);
  p_call_info := ltrim(REGEXP_REPLACE(REGEXP_REPLACE(chr(10)||p_call_info,
                                                     chr(10)||'.*?'||chr(32)||'|'||chr(32)||'[a-z]+?'||chr(32)),
                                      chr(32)||'{2,}',
                                      chr(10)),
                       chr(10));
  
  v_cnt := length(p_call_info) - length(replace(p_call_info, chr(10)));
  v_str := substr(p_call_info, instr(p_call_info, chr(10), 1, v_cnt - 2) + 1,
                  instr(p_call_info, chr(10), 1, v_cnt - 1) - 1 - instr(p_call_info, chr(10), 1, v_cnt - 2));
  
  v_cnt := length(v_str) - length(replace(v_str, ' '));
  v_str := substr(v_str, instr(v_str, ' ', 1, v_cnt) + 1);
  
  v_cnt         := instr(v_str, '.');
  p_owner       := substr(substr(v_str, 1, v_cnt - 1), 1, 30);
  p_object_name := substr(substr(v_str, v_cnt + 1), 1, 30);
exception
  when others then
    null;
end;

作者: homeworld80   发布时间: 2011-09-10

先收藏了,感谢楼主分享。

作者: xgghxkhuang   发布时间: 2011-09-10