APP下载

谈谈Oracle数据库异常处理

2017-01-30

山西青年 2017年17期
关键词:数据库系统语句逻辑

毕 桂 徐 霖

无锡工艺职业技术学院,江苏 宜兴 214206

谈谈Oracle数据库异常处理

毕 桂 徐 霖

无锡工艺职业技术学院,江苏 宜兴 214206

进行Oracle数据库开发中,在程序的运行过程中,可能会因为各种原因发生这样或那样的错误,就需要针对错误进行处理,异常处理就是这样的一段程序。有了异常处理就可以提高我们的程序代码质量,一个好的程序都必含有能够处理发生的任何错误。PL/SQL用异常和异常处理器来实现错误处理,它的异常处理机制提供了能够处理前面未处理异常的功能。

Oracle数据库;程序代码;异常处理;PL/SQL

一、异常的定义和分类

Oracle中出现错误的情形通常分为程序在编译时错误(compile-time error)和程序在运行时错误(run-timeerror)。一个程序在处理运行时出现错误,这是异常处理,一个程序在编译时的错误,并不是异常处理,我们这里所说的异常处理是指程序通过编译没有错误,而是在程序运行中出现的错误。当程序在运行时发生错误,异常被触发,程序的正常执行过程被终止,程序无条件转到异常处理部分,在Oracle数据库允许声明其他异常条件类型以扩展错误/异常处理,有了这样的扩展使PL/SQL的异常处理非常灵活。在Oracle数据库中,PL/SQL将异常分为预定义异常和用户定义异常。

(一)预定义异常

Oracle数据库自身为用户提供了大量的、可以在PL/SQL中使用的预定以异常,方便用户检查代码失败的一般原因,它们都定义在Oracle的核心PL/SQL中。每当PL/SQL违背了Oracle原则或超越了系统依赖的原则时就会隐式的产生内部异常。每个Oracle错误都有一个号码,在PL/SQL中通过名字处理预定义异常,PL/SQL为一些Oracle公共错误进行了预定义。如SELECT INTO语句返回多行数据时,PL/SQL就会触发预定义异常TOO_MANY_ROWS。

(二)自定义异常

用户自定义异常不一定必须是Oracle返回的系统错误,这些错误Oracle数据库本身无法知晓,也不能控制。用户可以在自己的应用程序中创建可触发及可处理的自定义异常,和预定义异常不同的是,用户定义的异常,系统不会自动触发(这种异常对系统来说不一定是错误),需要用户来触发异常,另外用户定义的异常,需要在声明部分定义。用户定义的异常处理部分基本上和预定义异常相同。

二、自定义异常

Oracle数据库内部预定义异常仅仅20个左右,而在实际程序运行过程中产生的异常情况就会很多,为此Oracle数据库经常使用错误编号和相关描述给出异常信息。数据库设计人员常常会根据实际的业务逻辑情况定义一些特殊异常。Oracle数据库的自定义异常可以分为错误编号异常和业务逻辑异常。

(一)错误编号异常

错误编号异常是指Oracle数据库系统发生错误时,系统就会显示出错误编号和相关信息的异常。用户可以根据错误编号来完成异常处理,由于错误编号比较抽象,不便于用户理解和记忆。对于这种类型的异常,首先在Oracle数据中PL/SQL块的声明部分使用EXCEPTION类型定义一个异常变量名,然后使用语句PRAGMA EXCEPTION _INIT为“错误编号”关联这个异常变量名,最后可以像对待Oracle数据库系统预定义异常一样处理了。我们通过一个实例,来说明一下,我们错误编号异常的使用。假设我们在Oracle数据库中已经创建了一个表单,名为student(编号(id),姓名(name),性别(sex))

declare

primary_id exception;——定义一个异常变量

pragma exception_init(primary_id,-00001);——关联错误号和异常变量名

begin

insert into student values(2,'张三','男');——向student表中插入一条与已有主键值重复的记录,以便引发异常

exception

when primary_id then ——若oracle捕获到的异常为-00001异常

dbms_output.put_line('主键已存在,不允许重复!');——输出异常描述信息

end;

通过运行结果可以看到,使用异常处理机制可以预防Oracle数据库系统因为引发异常而导致程序崩溃的作用,它可以让我们书写的程序有机会进行自动检测和修改错误。从上面的例子可以看出自定义异常比较容易理解和记忆,也方便数据库人员使用。

(二)业务逻辑异常

在数据库的实际开发过程中,数据库开发人员有时会根据开发对象的业务逻辑情况自己定义一个异常,通过这种方法来提醒数据库开发人员操作违反业务逻辑规则,从而引发自己定义的异常,中断程序的运行来进行自定义异常的处理。业务逻辑异常首先是需要在DECLARE进行声明一个异常变量;然后在BEGIN过程中先给出需要的业务逻辑规则再执行RAISE语句;最后在EXCEPTION中进行编写对异常进行处理的程序语句。下面我们通过一个实例来看看如何定义和引发业务逻辑异常:

declare

null_exception exception;——声明一个异常变量

S student %rowtype;

begin

S.id:=3;——ID是主键进行赋值,

insert into student values(S.id,S.name,S.sex);——向student表中插入一条记录

if S.name is null then ——判断表的name的值是否为空

raise null_exception;——引发异常,进行异常处理

end if;

exception

when null_exception then

dbms_output.put_line('name不可以为空');——当引发异常时,输出异常信息

rollback;

end;

通过运行结果可以看到,业务逻辑异常定义成功。程序就可以进行检测我们向数据库表单STUDENT中插入数据时是否存在学生NAME为空的情况了。

总的来看,在一段没有语法错误的程序代码中,因为出现了不太“合格”数据而导致程序无法运行。我们希望提高自己的代码质量,使得我们的程序更加健壮,我们对程序做了异常处理。从上面的异常处理过程中,我们可以看出:对于预定义异常和错误编号异常是由我们Oracle数据库系统判断的,但是对于业务逻辑异常,我们Oracle数据库系统本身就无法知道了,通常我们是通过一个引发异常的机制(RAISE语句)来完成,从而可以实现对业务逻辑规则的判断。

[1]刘竹林.数据库设计与Oracle数据库应用教程.清华大学出版社,北京大学出版,2009.

[2]张晓林,吴斌,晁阳.Oracle数据库开发基础教程.清华大学出版社,2009.

[3]赵宇兰.Oracle数据库应用技术.合肥工业大学出版社,2014.

TP

A

1006-0049-(2017)17-0187-01

猜你喜欢

数据库系统语句逻辑
刑事印证证明准确达成的逻辑反思
逻辑
创新的逻辑
重点:语句衔接
Oracle数据库系统的性能优化研究
女人买买买的神逻辑
微细铣削工艺数据库系统设计与开发
江苏省ETC数据库系统改造升级方案探讨
我喜欢
作文语句实录