Oracle存储过程中的异常处理

转载 2015年11月18日 21:26:59
 1.问题来源
Oracle中可以用dbms_output.put_line来打印提示信息,但是很容易缓冲区就溢出了。
可以用DBMS_OUTPUT.ENABLE(1000000);来设置缓冲区的大小。
但是有大小,就有可能再溢出(程序写得太烂,错误不断,不好意思)。
于是想把异常信息写到一个表中。
2.建表
这个容易
create table wErrorLog
(
  procedure_name varchar2(50) not null
 ,err_msg        varchar2(255) not null
 ,sys_err_code   varchar2(10) not null
 ,sys_err_msg   varchar2(1000) not null
 ,create_time     date         not null
);
comment on table wErrorLog is 'log表,用于记录存储过程的错误';
comment on column wErrorLog.procedure_name is '过程名,出错的存储过程或函数';
comment on column wErrorLog.err_msg is '自定义出错信息';
comment on column wErrorLog.sys_err_code is 'Oracle系统的出错代码';
comment on column wErrorLog.sys_err_msg is 'Oracle系统的出错信息';
comment on column wErrorLog.create_time is '错误发生时间';
3.存储过程
CREATE OR REPLACE PROCEDURE prc_err_log
(
 i_procedure_name Varchar2
,i_err_msg        Varchar2
)
--写日志的过程,Albert Song 2005-06-28
--注意本过程没有进行commit或rollback操作
--用法
--Exception
--   WHEN OTHERS
--   Then
--      rollbak;
--      prc_err_log('prc_err_log','写日志表错误');
--      commit;
As
v_sqlcode Varchar(10);
v_sqlerrm Varchar(1000);
Begin
  v_sqlcode:=Sqlcode;
  v_sqlerrm:=Sqlerrm;
  Insert Into wErrorLog Values(i_procedure_name,i_err_msg,v_sqlcode,v_sqlerrm,Sysdate);
  Exception
   WHEN OTHERS
   Then
      v_sqlcode:=Sqlcode;
      v_sqlerrm:=Sqlerrm;
      Insert Into wErrorLog Values('prc_err_log','写日志表错误',v_sqlcode,v_sqlerrm,Sysdate);
END;
4.使用
create or replace procedure prc_test
As
v_data varchar2(255);
Begin
  Insert Into wErrorLog Values('prc,'错误','test','test',Sysdate);
  Select err_msg Into v_data from wErrorLog  where err_msg='no err msg';
  Exception
  When Others Then
  Rollback;
  prc_err_log('prc_test','测试prc_err_log');
  Commit;
  
end ;
5.测试
exec prc_test;
select * from wErrorLog;
6.说明
为什么不能在prc_err_log中commit?
目的是可以用在这样的地方
create or replace procedure prc_test_transaction
As
v_in Varchar2(255);
begin
  Insert Into testsql Values('11','55');
  If 1=1 Then 
  begin
            Select code Into v_in From testsql Where code='12323';
            exception
           when others  
           then 
             prc_err_log('prc_test_transaction','testsql表中不存在code为12323的记录');
      
            end;
 END IF;
 ...
 commit;
 
  Exception
   WHEN OTHERS
   Then
      rollback;
      prc_err_log('prc_err_log','出现了未知的错误');
      commit;
end ;
这种情况下,如果在第一个prc_err_log处commit会将已经执行的操作提交了。

后记:
我的目的只有一个,就是详细地记录程序的运行过程,最好是能知道哪一行程序出了异常。现在可以在err_msg里记录一些自定义的变量来跟踪程序状态了。
刚学Oracle不久,我觉得应该有更好的方法,但是我没有找到,自己也没有创造出来。
dbms_output有个new_line不知是不是可以防止缓冲区溢出呢? 

相关文章推荐

Oracle存储过程中异常处理总结

对于一些比较复杂的逻辑处理,我们通常hui

Oracle 存储过程异常处理

转载自:http://blog.csdn.net/jojo52013145/article/details/6585833 1、异常的优点        如果没有异常,在程序中,应当检查...

Oracle存储过程的异常处理

文章出处: http://www.cnblogs.com/linjiqin/archive/2011/04/18/2019905.html 1、为了提高存储过程的健壮性,避免运行错误,当建立存储过程...

Oracle 存储过程异常处理 .

1、异常的优点        如果没有异常,在程序中,应当检查每个命令的成功还是失败,如    BEGIN    SELECT ...    -- check for ’no data fo...

Oracle - 存储过程异常处理事务分析

Oracle存储过程中的事务是如何处理的?通常情况下。整个过程是作为一个事务整体被提交或回滚的,这属于数据库的基本知识,这里简单说明:   1通常情况通常情况下,oralce将整个存储过程作为一个事务...
  • cbjcry
  • cbjcry
  • 2017年04月13日 10:36
  • 411

Oracle存储过程异常处理总结

1、异常的优点        如果没有异常,在程序中,应当检查每个命令的成功还是失败,如    BEGIN    SELECT ...    -- check for ’no data fo...

oracle 存储过程,游标、异常处理,集合使用入门详解

我们在进行pl/sql编程时打交道最多的就是存储过程了。存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识。如:游标的处理,异常的处理,集...

106---oracle的PL/SQL,异常处理, 游标(CURSOR), 子程序,存储过程

一、     PL/SQL   PL/SQL是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言 PL/SQL的工作原理 PL/SQL引擎接受 PL...

109---oracle的oracle的PL/SQL,异常处理, 游标(CURSOR), 子程序,存储过程

1.      表空间   创建一个自动增长的表空间tp_orders CREATE TABLESPACE tp_orders DATAFILE 'E:\Data\WORKTBS01.DBF' ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle存储过程中的异常处理
举报原因:
原因补充:

(最多只允许输入30个字)