Oracle Exception 处理
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 Exception 处理的更多相关文章
- Oracle Exception
Oracle存储过程的异常处理 1.为了提高存储过程的健壮性,避免运行错误,当建立存储过程时应包含异常处理部分.2.异常(EXCEPTION)是一种PL/SQL标识符,包括预定义异常.非预定义异常和自 ...
- Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR
抛出异常 Oracle有三种类型的异常错误: 1. 预定义(Predefined)异常 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. ...
- 记录centos6.8安装Oracle10.2.0.1过程中的错误解决
[root@hadoop01 database]# ./runInstaller ./runInstaller: /opt/database/install/.oui: /lib/ld-linux.s ...
- PL/SQL异常处理方法
PL/SQL异常处理方法 1:什么是异常处理: PL/SQL提供一个功能去处理异常,在PL/SQL块中叫做异常处理,使用异常处理我们能够测试代码和避免异常退出. PL/SQL异常信息包含三个部分: ...
- 执行Sql块
import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import oracle.C ...
- 【面试题】Java EE面试题
第一部分:Servlet/JSP快速入门 1. 请列举至少6种javaEE技术,并简述其作用. 解析: javaEE是一系列的技术,主要包扩13种.对于开发人员来说,了解几种主要的技术是非常 ...
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
- oracle PL/SQL(procedure language/SQL)程序设计之异常(exception)
什么是异常?在PL/SQL中的一个标识.在程序运行期间被触发的错误.异常是怎样被触发的?产生一个Oracle错误.用户显示触发.怎样处理异常?用异常处理句柄捕获异常.传播异常到调用环境. 捕获异常 E ...
- “System.Exception: System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本” 的解决方案
在项目部署过程中ORACLE客户端多次会遇"System.Exception: System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本&qu ...
随机推荐
- DTCMS自定义标签,tags分割
DTcms.Web.UI\Label\article.cs /// <summary> /// 自定义:分割tags /// </summary> /// <param ...
- ASP.Net MVC中JSON处理。
实体数据Model [Serializable] public class UserModel { //public UserModel(string name, string classname, ...
- canvas主要属性和方法
canvas主要属性和方法 方法 描述 save() 保存当前环境的状态 res ...
- Linux下面对于VIM编辑器的代码折叠使用与screen
VIM设置代码折叠 1. 折叠方式 可用选项 'foldmethod' 来设定折叠方式:set fdm=*****.有 6 种方法来选定折叠: manual 手工 ...
- [大牛翻译系列]Hadoop(6)MapReduce 排序:总排序(Total order sorting)
4.2.2 总排序(Total order sorting) 有的时候需要将作业的的所有输出进行总排序,使各个输出之间的结果是有序的.有以下实例: 如果要得到某个网站中最受欢迎的网址(URL),就需要 ...
- js中的异常处理try...catch使用介绍
在JavaScript可以使用try...catch来进行异常处理. 例如: try { foo.bar();} catch (e) { alert(e.name + ": " + ...
- 使用PHP获取汉字的拼音(全部与首字母)
<?php /** * 取汉字拼音 * edit by www.jbxue.com */ class GetPingYing { private $pylist = array( 'a'=> ...
- php入门变量之数字
在介绍变量时,我明确指出PHP具有整型和浮点型(小数)数字类型.但是,依据我的经验,这两种类型都可以归类到一般的数字之下(在极大程度上是这样的). 下面列举下PHP中有效的数字类型的变量: 8 3.1 ...
- 《Java并发编程实战》读书笔记(更新中)
一.简介 1.多线程编程要注意的几点: 安全性:永远不发生糟糕的事情 活跃性:某件正确的事情最终会发生(不会发生无限循环或者死锁) 性能:正确的事尽快发生(上下文切换消耗之类的) 二.线程安全 1.为 ...
- java 中的匿名内部类
转自http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能 ...