PL/SQL基础-异常处理

--*********异常处理
一、异常的类型
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;

 

你可能感兴趣的:(pl/sql)