Oracle异常
异常有两种:
预定义异常(内部异常):当pl/sql程序违反oracle规则或超越系统限制时隐式引发
用户定义异常:用户可以在pl/sql块的声明部门定义异常。自定义的异常通过RAISE语句显示引发
处理预定义异常:在pl/sql块要捕获异常,必须使用系统所给出的异常名称。而不是异常编号。
错误处理
需要先定义异常变量,然后在需要产生异常的地方抛出异常,然后在异常不利部门进行捕获异常进行处理。
DECLARE
NO_MONEY_ERROR EXCEPTION;--定义异常变量
MONEY NUMBER :=4000;
MALANCE NUMBER:=3000;
BEGIN
IF BALANCE < MONEY THEN
RAISE ON_MONEY_ERROR;--抛出异常
ELSE
DBMS_OUTPUT.PUTLINE('转账成功!!!');
EBD IF;
EXCEPTION
WHEN ON_MONEY_ERROR THEN
DBMS_OUTPUT.PUT_LINE('你是穷么?余额不足!!!');
END;
/
自定义异常
在存储过程编程的过程中,有时候我们要自定义比较详细的异常信息,可以使用PAISE_APPLICATION_ERROR
语法:PAISE_APPLICATION_ERROR 错误编码,错误信息
注意:错误编码是用户为抛出异常指定的编号,范围在-20000到-20999之间错误消息是用户定义的错误消息,长度为2048
DELARE
MONEY NUMBER :=4000;
BALANCE NUMBER :=3000;
BEGIN
IF BALANCE <MONEY THEN
RAISE_APPLICATION_ERROR('余额不足!!');
ELSE
DBMS_OUTPUT.PUT_LINE('转账成功!!');
END IF;
END;
/
非自定义异常
1:系统中有很多错误没有名称,在捕获错误时不能直接使用编号,要使用名称
2:我们可以自定义一个异常变量,将改变量与系统无名的异常编号相关联
3:这样就可以通过自定义的异常变量抛出系统没有名字的异常
DELARE
异常变量 EXCEPTION;--自定义异常变量
PRAGMA EXCEPTION_INIT(异常变量,-1);--将编号为-1的系统异常赋给异常变量
BEGIN
INSERT INTO 表名(列名) VALUES (数据);
EXCEPTION
WHEN 异常变量 THEN
DBMS_OUTPUT.PUT_LINE('数据已存在!!');
END;
异常传播
没有捕获的异常将沿检车异常调用程序传播到外面,当异常被处理并解决或到达程序最外层传播停止。
BEGIN
执行语句1;
BEGIN
执行语句2
BEGIN
执行语句3,产生异常;
EXCEPTION
WHEN 异常变量 THEN
--该处不能处理异常,异常并未在此结束
END;
EXCEPTION
WHEN others THEN
处理异常
END;
END;
如果还不明白,这有个大神发的信息,可以看一下。上述内容为本人编写,并非转载。http://www.tuicool.com/articles/zUbeIrE