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.32 自定义异常执行结果