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 存储过程中的循环语句写法

资料来源:http://liliangjie.iteye.com/blog/812771 首先科普一下:  oracle 游标属性 sql%found sql%notfound sql%row...
  • ying890
  • ying890
  • 2016年05月23日 20:30
  • 4640

Oracle存储过程中的面向对象特性

 1. package的封装 Package提供了一种封装的机制,可以将存储过程、方法、定值、Type放在一起。这实际上应该是一种面向对象的思想。pck文件包括两部分:package 和p...
  • heqiyu34
  • heqiyu34
  • 2014年01月03日 19:34
  • 1304

Oracle存储过程例子:运用了正则表达式、数组等

Oracle存储过程例子:运用了正则表达式、数组等 CREATE OR REPLACE PROCEDURE "SP_GET_ARTICLE_DATA" (article_det...
  • chuang123
  • chuang123
  • 2016年05月03日 18:28
  • 861

oracle存储过程中update不成功的一个原因

今天一个同事写oracle 的存储过程遇到了一个问题, 他在里面update 操作不能完成更新的操作, 但是又不会报错.         如一个表 A(id, code, name, ty...
  • wugouzi
  • wugouzi
  • 2013年06月20日 16:54
  • 1397

项目中oracle存储过程记录——常用语法备忘

项目中需要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张表),然后把符合条件的记录插入到目标表中。其中原表之一的日期字段是timestamp类型,目标表的字段是varchar2类...
  • neweastsun
  • neweastsun
  • 2014年10月14日 11:39
  • 1412

如何利用Oracle外部表导入文本文件的数据

同事最近在忙数据一致性比对工作,需要对不同文本文件中的数据进行比对,有的文件较大,记录较多,如果用普通的文本编辑器打开的话,很显然,会很卡,甚至打不开。 基于此,可将该文本文件的数据导入到数据库中,...
  • Eason_oracle
  • Eason_oracle
  • 2017年04月25日 18:29
  • 325

Oracle TRIM函数语法介绍

Oracle TRIM函数是很常见的函数,下面对Oracle TRIM函数的语法作了详尽的阐述说明,希望可以让您对Oracle TRIM函数有更深的认识。 如果提到Oracle TRIM函数,最简单...
  • u013028136
  • u013028136
  • 2014年03月12日 13:52
  • 811

Oracle存储过程的事务

1.Oracle事务不会自动提交。通常情况下,oralce将整个存储过程作为一个事务整体,整个过程内的事务,要么都提交,要么都回滚。 2.如果过程内部使用了commit命令或rollback命令,则存...
  • yuhualee
  • yuhualee
  • 2014年03月05日 19:21
  • 3593

oracle存储过程、声明变量、for循环

1、创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out type) as --声明变量(变量...
  • lcczzu
  • lcczzu
  • 2014年09月29日 11:32
  • 660

ORACLE存储过程笔记2----运算符和表达式

存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。 运算符和表达式     关系运算 =等于 ...
  • jcy2sls
  • jcy2sls
  • 2013年12月09日 08:38
  • 2450
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle存储过程中的异常处理
举报原因:
原因补充:

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