7.6.5 自定义异常

如果开发当中遇到与实际业务相关的错误,例如产品数量不允许为负数,生产日期必须在质保日期之前等,这些和业务相关的问题并不能算系统错误,也不能使用预定义和非预定义异常来捕捉它们。如果要想用异常的方式处理这些问题,那么这样的异常需要开发人员自己编写,而且在调用的时候也需要显式的触发。

【示例27】自定义异常示例

要求根据输入的产品ID得到产品数量,如果产品数量小于0,则抛出异常,并做出提示。脚本如下:


01 DECLARE

02 v_prcid PRODUCTINFO.Productid%TYPE:='&产品ID';

03 v_qunty PRODUCTINFO.Quantity%TYPE;

04

05 quantity_exp EXCEPTION;

06 PRAGMA EXCEPTION_INIT(quantity_exp,-20001);

07

08 BEGIN

09

10 SELECT quantity INTO v_qunty

11 FROM PRODUCTINFO

12 WHERE productid=v_prcid;

13

14 IF v_qunty<0 THEN

15 RAISE quantity_exp;

16 END IF;

17

18 DBMS_OUTPUT.PUT_LINE('该产品的数量是:'||v_qunty);

19

20 EXCEPTION

21 WHEN quantity_exp THEN

22 DBMS_OUTPUT.PUT_LINE('出现产品数量为空的数据,请核查!');

23 ROLLBACK;

24 WHEN NO_DATA_FOUND THEN

25 DBMS_OUTPUT.PUT_LINE('没有对应的数据!');

26 WHEN TOO_MANY_ROWS THEN

27 DBMS_OUTPUT.PUT_LINE('对应数据过多,请确认!');

28

29 END;

30 /


【代码解析】

❑第2行表示声明变量v_prcid,它的值由替换变量“&产品ID”决定,利用替换变量可以达到创建通用脚本的目的。当执行程序时会提示输入替换数据,最后运行到脚本的是替换后的数据。

❑第3行声明变量v_qunty表示产品数量。

❑第5行声明异常名称quantity_exp。

❑第6行表示为异常关联一个错误号。其中错误号的范围是-20 999~-20 000的负整数,该范围内的错误号可以随便使用,不用担心被占用。

❑第10~12行表示根据产品ID查询其数量,并赋值给变量v_qunty。

❑第14~16行表示判断产品数量是否为负数,如果为负数,则抛出quantity_exp异常。利用RAISE关键词可以显式地抛出异常。

❑第20~27行代表异常处理部分。异常处理部分由3个WHEN…THEN子句组成。

【执行效果】

在SQL*Plus中执行程序,按照提示输入“产品ID”,这里输入“0240010001”。执行结果见图7.32。

7.6.5 自定义异常 - 图1

图 7.32 自定义异常执行结果