Oracle错误处理打印错误行数 dbms_utility.format_error_backtrace的使用

本文展示了如何在Oracle数据库中创建日志表、测试表并插入数据,然后定义一个存储过程来处理异常。当存储过程中发生错误时,使用DBMS_UTILITY.FORMAT_ERROR_BACKTRACE捕获错误信息,并将这些信息记录到日志表中,这对于故障排查非常有帮助。
部署运行你感兴趣的模型镜像

##创建日志表
create table t_error_log
(
  pro_name     varchar2(300),
  error_desc    varchar2(2000),
  exec_date     date
);

##创建测试表
create table test_error_stack(
 id number primary key
);

##插入测试数据
insert into test_error_stack values (1);
commit;

##创建存储过程
create or replace procedure pr_error_code_test
is
v_backtrace    varchar2(1000);       --返回错误行
v_error        varchar2(1000);       --整合错误内容

begin
--要执行的sql语句
  INSERT INTO test_error_stack values (2);
  INSERT INTO test_error_stack values (1);   --这条数据会报错,违反唯一约束
  commit;
--异常错误记录处理
exception
  when others then
   v_backtrace:=dbms_utility.format_error_backtrace;
   rollback;
   v_error:='异常错误为:'||v_backtrace;
   insert into t_pro_error_log(pro_name,error_desc,exec_date)
   values('pr_error_code_test',v_error,sysdate);
   commit;
   return;
    
end pr_error_code_test;
/


##执行存储过程
exec pr_error_code_test;

##检查结果
SQL> select * from t_error_log;

 
PRO_NAME                                                              ERROR_DESC                                                               EXEC_DATE
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------- -----------
pr_error_code_test                                                  异常错误为:ORA-06512: 在 "PR_ERROR_CODE_TEST", line 9                      2020/10/14
 
SQL> 


SQL> select * from test_error_stack;
 
        ID
----------
         1
 
SQL> 

##结论
通过dbms_utility.format_error_backtrace包可以打印存储过程中出错的位置,对于问题分析很有帮助

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

set serverout on; declare v_sql varchar2(300); v_Errmsg varchar2(300); begin delete from user_index_stats; commit; for i in (select table_name, index_name, num_rows from user_indexes where index_type like '%NORMAL%' and partitioned='NO' and not (regexp_like(table_name,'^TMP[[:alnum:]]{27}$')) and temporary='N' and num_rows > 0 order by 3 desc) loop begin v_sql := 'analyze index '||i.index_name||' validate structure '; execute immediate v_sql; insert into user_index_stats(table_name, height, blocks, index_name, partition_name, lf_rows, lf_blks, lf_rows_len, lf_blk_len, br_rows, br_blks, br_rows_len, br_blk_len, del_lf_rows, del_lf_rows_len, distinct_keys, most_repeated_key, btree_space, used_space, pct_used, rows_per_key, blks_gets_per_access, pre_rows, pre_rows_len, opt_cmpr_count, opt_cmpr_pctsave) select i.table_name, height, blocks, name, partition_name, lf_rows, lf_blks, lf_rows_len, lf_blk_len, br_rows, br_blks, br_rows_len, br_blk_len, del_lf_rows, del_lf_rows_len, distinct_keys, most_repeated_key, btree_space, used_space, pct_used, rows_per_key, blks_gets_per_access, pre_rows, pre_rows_len, opt_cmpr_count, opt_cmpr_pctsave from index_stats; exception when others then v_Errmsg :=substr(dbms_utility.format_error_backtrace,1,150); v_Errmsg :=v_Errmsg||substr(dbms_utility.format_error_stack,1,150); insert into user_index_stats(table_name, index_name, comments) values (i.table_name, i.index_name, v_Errmsg); end; end loop; commit; for i in (select table_name, index_name, round(del_lf_rows/lf_rows,2) del_pct, blocks, lf_rows, lf_rows_len, del_lf_rows, del_lf_rows_len, (lf_rows - del_lf_rows) gap_num_rows from user_index_stats where height >= 3 and (lf_rows > 0 and del_lf_rows/lf_rows >= 0.2) order by height desc, del_lf_rows/lf_rows desc) loop begin v_sql := 'alter index '||i.index_name||' rebuild online parallel 4'; execute immediate v_sql; v_sql := 'alter index '||i.index_name||' noparallel'; execute immediate v_sql; --dbms_output.put_line(i.index_name); update user_index_stats set rebuild_date = sysdate where index_name = i.index_name; commit; exception when others then v_Errmsg :=substr(dbms_utility.format_error_backtrace,1,150); v_Errmsg :=v_Errmsg||substr(dbms_utility.format_error_stack,1,150); update user_index_stats set comments = v_Errmsg where index_name = i.index_name; end; commit; end loop; end;
最新发布
08-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值