2009-07-24 10:39:10 来源:IT专家网
在数据库设计中,函数、过程等等是少不了的。为了提高这些内容与用户的交互性,往往需要在函数、过程设计过程之中加入异常处理过程。当其运行错误时,能够及时向用户反映相关的错误信息。如现在某个过程用来处理四则运算。
如果用户提供的参数不符合四则运算的要求,那么其就需要抛出一个异常信息给用户。而不是说遇到错误的时候就不做任何处理。如果不抛出异常信息的话,那么用户就有可能一直在那边等待。而事实上数据库的过程或者函数已经因为用户提供的参数出错而停止了处理。
所以说,为了提高数据库的错误处理能力,数据库(数据库表连接方式分析及常见用法)开发人员与管理人员需要在数据库设计之时,认证考虑应用程序可能出现的各种错误,特别是在与用户交互过程中出现的错误。并使用数据库提供了异常处理器来有效的加以解决。一个普遍的原则是,数据库运行过程中的错误应该一个不漏的像用户反映并尽可能的显示准确的错误原因,如参数数据类型不符合等等。这有助于给用户或者数据库管理员解决错误时提供更加有效的的帮助信息。笔者在这篇文章中,就跟大家讨论一下Oracle数据库中异常处理的基本步骤。或许这些内容并不是很难,笔者只是希望大家能够建立起这个观念。
步骤一:定义异常。
在Oracle数据库中,一场大致分为三类,分别为预定义异常、非预定义异常和自定义异常。预定义异常时Oracle系统一场中的一种,用于处理常见的Oracle错误。如违反约束规则、往非空字段中插入空值时,系统都会像用户反映异常信息。这些信息就是系统的预定义异常。在Oracle数据库设计时,管理人员主要需要注意的就是自定义异常。自定义异常用来处理用户定义的错误信息。简单的说,就是这些异常不是数据库自身的问题所造成的,而是管理员定义的函数、过程在运行过程中的一些错误信息多导致的。换一个角度来说,有可能这个异常Oracle数据库并不认为是异常,但是管理员为了实现某个特定的目的,认为这是一场的。如用户需要通过一个过程来更新一张表。但是这张表中有一个材料用量的字段,用户要求这个字段的值必须为大于0的数字。如果更新的目标值小于0,则这个过程就执行失败。并且需要向用户抛出一个异常信息,表明目标值不能够小于0。对于Oracle数据库(外部表在Oracle数据库中使用心得)来说,只要这个字段时数值型的数据类型,那么小于0的数据其也可以接受。所以说Oracle数据库系统不认为其是错误。但是数据库管理员出于数据的合法性,需要在更新之前先对数据进行检查,看其是否符合既定的规则。不过不符合的话,就需要向用户抛出一个异常,并注明具体的原因。如此的话,用户在查找错误原因并最终排除故障,就很简单了。
要在Oracle数据库的过程或者函数中,自定义异常是一个比较简单的过程。由于自定义异常跟系统异常不同,需要用户像定义变量一样进行自定义。其实预定义异常在Oracle系统中就是一个特殊的变量。管理员需要在函数或者过程的声明部份定义一个EXCEPTION类型的变量。如可以利用如下的格式进行定义:e_numbernotzero EXCEPTION;这就定义了一个异常,表示参数不能够为零。在定义异常名字的时候,需要注意两点。首先异常名字最好能够反映一定的含义。也就是说,让管理员一看到这个异常名字就代表其具体的含义。这有利于后续系统的维护。其次异常名字最好小写,以与系统变量的区别;同时最好在异常名字前面加入一个前缀,如e_,表示这是一个异常类型的变量,与其他的变量区分开来。这些都是定义异常过程中的一些小技巧,以帮助数据库设计人员更好的管理这些异常,并方便其他团队人员的使用。
步骤二:利用RAISE抛出异常。
自定义异常与系统预定义异常不同,还需要管理员在函数或者过程的代码中利用RAISE关键字来抛出异常。也就是说,Oracle数据库系统会自动识别雄异常。当系统异常发生时,数据库异常处理机制会自动抛出相应的预定义异常或者非预定义异常。但是数据库系统不会自动识别用户定义的自定义异常。所以当产生自定义错误时,就需要数据库开发人员或者数据库管理员使用特定的代码来抛出相应的自定义异常。
不过在代码中抛出自定义异常,也是一件比较简单的事情。如只需要使用关键字“ RAISE 异常名”的格式就可以将遇到的异常抛出去。由此可见,如果异常名取一个相对有具体含义的值,那么在抛出异常时,这个抛出语句也就有了具体的含义。为此笔者再次强调一次,这个异常抛出的名字最好由具体的含义。
步骤三:捕获并处理异常信息。
当过程或者函数处理过程中抛出相应的异常之后,还需要对异常的信息进行处理。如上面的例子中,系统在抛出异常的过程中,不会说明异常的原因,而只是简单的将一个异常信息抛出去。但是这个异常信息对于用户来说,可能没有多少的实用价值。因为这个信息并没有告诉用户,到底是由于什么原因才导致了这个异常信息。所以,在函数或者过程的尾部,需要加入一个捕获并处理异常信息的机制,将异常信息产生的原因描述清楚,如说明是执行哪个语句时抛出的异常等等。只有如此,这个异常信息对用户采用实际上的利用价值。
在异常处理部分,其主要有异常捕获语句和异常处理语句两个部分组成。由于在一个PL/SQL程序中,管理员可能定义了多个异常。所以在捕获的时候,捕获语句需要判断到底系统抛出的是哪个异常。然后管理员才能够根据异常的名字来设置相应的异常信息。这主要是根据各类异常的名字加以识别。可见异常名字的重要性。如果异常名字具有特殊的含义,那么在此处定义异常信息时,根据异常的名字就可以轻松的描述异常的原因,而不需要再去看抛出异常的相关语句。
跟其他开发语言一样,在Oracle数据库中主要利用WHEN子句来捕获各种异常。其主要是通过识别异常名来实现的。然后利用TEHN关键字来处理各种异常。具体如何处理,就是由不其后面不同的语句来完成。其基本的格式就使WHEN…TEHN…也就是说,WHEN子句来判断到底抛出的异常是哪个异常,然后THEN后面的语句来说明处理方式。这里最常见的处理方式就是向用户说明这个异常出现的具体原因,或者所涉及到的语句。
在Oracle数据库中自定义异常的实现过程相对来说是比较简单的。简单归简单,最后笔者还是有几个注意事项想提醒数据库开发人员与管理人员。
在以上异常信息的处理过车观念中,可以将多个异常信息合并处理。即在WHEN关键字后面加入多个异常名(中间利用OR关键字分割)。此时即使 PL/SQL程序代码抛出多个异常,数据库也采用一种处理方式。这虽然是可行的,但是笔者建议不要这么处理。因为如果向用户反映异常信息的话,用户就不知道到底是由于什么原因导致了这个异常。其甚至需要去查看源代码或者对可能出现异常的原因进行一一测试,最后才能够发现具体的原因。这对于管理员或者用户排除故障是非常不方便的。
为此笔者的建议是,在定义异常处理信息的时候,最好一个异常对应一个语句。也就是说,要把异常处理分开来,如现在有一个存储过程,主要的作用是将销售订单根据物料清单展开然后生成采购订单。在这个处理过程中,会出现各种各样的异常。如展开过程中可能所在的会计期间没有打开,又或者供应商没有定义,再或者采购订单有重复等等。如果最好只是利用一个异常语句来处理,告诉用户“无法成功创建采购订单”,那么此时用户不得不去一一很对这些信息,看看当月或者下月(可能采购订单日期下在以后的月份)的会计期间有否打开、所涉及到的物料有没有定义供应商和价格、采购订单号码是否有重复等等。这显然对于处理问题不利。相反,如果现在在处理异常的时候,能够一个异常一个处理语句。如系统因为供应商没有定义而抛出异常时,则在处理这个异常信息时,可以向用户提示 “无法成功创建采购订单,供应商没有定义”。显然这更有利于用户查找问题。设置不需要系统管理员的帮助,用户都可以根据错误信息来排除故障原因。为此,笔者强烈建议,在捕获与处理异常的时候,最好能够异常与处理异常的语句能够一一对应。
免责声明:本网站(http://www.ciotimes.com/)内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。