--*********异常处理
一、异常的类型
ORACLE异常分为两种类型:系统异常、自定义异常。
其中系统异常又分为:预定义异常和非预定义异常。
1.预定义异常
ORACLE定义了他们的错误编号和异常名字,常见的预定义异常处理Oracle常见的错误
NO_DATA_FOUND SELECT ... INTO ... 时,没有找到数据
DUL_VAL_ON_INDEX 试图在一个有惟一性约束的列上存储重复值
CURSOR_ALREADY_OPEN 试图打开一个已经打开的游标
TOO_MANY_ROWS SELECT ... INTO ... 时,查询的结果是多值
ZERO_DIVIDE 零被整除
2.非预定义异常
ORACLE为它定义了错误编号,但没有定义异常名字。我们使用的时候,先声名一个异常名,
通过伪过程PRAGMA EXCEPTION_INIT,将异常名与错误号关联起来。
3.自定义异常
程序员从我们业务角度出发,制定的一些规则和限制。
二、异常处理
PL/SQL中,异常处理按个步骤进行:
定义异常
抛出异常
捕获及处理异常
a.定义异常
exception_name EXCEPTION;
b.抛出异常
RAISE exception_name
c.捕获及处理异常
EXCEPTION WHEN e_name1 [OR e_name2 ... ] THEN statements; WHEN e_name3 [OR e_name4 ... ] THEN statements; ...... WHEN OTHERS THEN statements; END;
--使用预定义的异常
--根据用记输入的商品ID来查商品库存
DECLARE V_ID ES_PRODUCT.ID%TYPE := &V_ID; --用户输入商品ID V_STOCKCOUNT ES_PRODUCT.STOCKCOUNT%TYPE; ---库存量 BEGIN SELECT STOCKCOUNT INTO V_STOCKCOUNT FROM ES_PRODUCT WHERE ID = V_ID; DBMS_OUTPUT.PUT_LINE('库存量:' || V_STOCKCOUNT); --判断库存量是否正常 IF V_STOCKCOUNT > 0 THEN --更新库存,一次买一个减掉一个 UPDATE ES_PRODUCT SET STOCKCOUNT = STOCKCOUNT - 1 --更新指定的,不然会全部更新 WHERE ID = V_ID; --提出数据操作 COMMIT; DBMS_OUTPUT.PUT_LINE('库存更新成功'); ELSIF V_STOCKCOUNT = 0 THEN DBMS_OUTPUT.PUT_LINE('库存量是0,没有库存了'); ELSE DBMS_OUTPUT.PUT_LINE('库存异常'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('该商品不存在!'); ROLLBACK; WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('该商品存在多个!'); ROLLBACK; WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('发生了其它错误!'); ROLLBACK; END;
--自定义异常
--实现订单删除
SELECT * FROM ES_ORDER; DECLARE E_NO_RESULT EXCEPTION; V_ID ES_ORDER.ID%TYPE := &ID; V_EXCEPTION1 CONSTANT VARCHAR2(50) := '删除数据不成功!'; V_EXCEPTION2 CONSTANT VARCHAR2(50) := '发生了错误!'; BEGIN DELETE FROM ES_ORDER WHERE ID = V_ID; IF (SQL%NOTFOUND) THEN --删除没有执行 RAISE E_NO_RESULT; END IF; EXCEPTION WHEN E_NO_RESULT THEN DBMS_OUTPUT.PUT_LINE(V_EXCEPTION1); ROLLBACK; WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(V_EXCEPTION2); ROLLBACK; END;