PLSQL学习(三) 异常处理
任何一种编程语言中的异常处理部分都是比较重要的一部分,单独学习一下。
一、异常的种类及基本用法:
1、预定义异常(总计21种,具体见文档)
使用方法:
BEGIN
SELECT
...
SELECT
...
SELECT
...
...
EXCEPTION
WHEN
NO_DATA_FOUND
THEN
...
常用类型:
NO_DATA_FOUND
--ORA-01403--
未找到行
TOO_MANY_ROWS
--ORA-01422--SELECT INTO
语句返回多行数据
VALUE_ERROR
--ORA-06502--
类型转换错误
ZERO_DIVIDE
--ORA-01476--
程序尝试除以
0
STORAGE_ERROR
--ORA-06500--PL/SQL
运行时内存溢出或内存不足
2、非预定义异常(EXCEPTION_INIT
)
方法一:
需要在declare中申明,申明后使用即与预定义异常相同
declare
e_deptno_remaining
exception
;
PRAGMA
EXCEPTION_INIT
(e_deptno_remaining, -
2292
);
begin
...
exception
when
e_deptno_remaining
then
dbms_output.put_line(
'
非预定义2292
'
);
when
others
then
dbms_output.put_line(
'others'
);
end
;
-2292必须是oracle自定义的错误号,前面加负号
如果需要自己设定,则必须在-20000——-20999之间
此方法无法定义异常信息。
方法二:
错误号与错误信息均可自己定义
且无需在declare和exception中声明
declare
i int := 5;
begin
if i=5then
raise_application_error (-20086/*-20000——-20999*/, '自定义错误信息');
endif;
end;
3、自定义异常(分为declare、raise、exception三部分)
使用示例:
declare
i int := 3;
ex exception;
begin
if i <=2then
raise ex;
else dbms_output.put_line(i);
endif;
exception
when ex then
dbms_output.put_line('xxx');
end;
二、注意使用Others的异常类:
在EXCEPTION中定义任何的异常后
尽量都使用when others
表示遭遇到除此之外的任何异常如何处理
EXCEPTION
WHEN exception_name1 THEN -- handler
sequence_of_statements1
WHEN exception_name2 THEN -- another handler
sequence_of_statements2
...
WHENOTHERSTHEN -- optional handler
sequence_of_statements3
END;
另外,在EXCEPTION中可以使用OR链接 WHEN over_limit OR under_limit OR VALUE_ERROR THEN
三、使用系统错误号和错误信息
错误号----SQLCODE;
错误信息--SQLERRM;
DECLARE
err_num NUMBER;
err_msg VARCHAR2(100);
BEGIN
...
EXCEPTION
WHENOTHERSTHEN
err_num := SQLCODE;
err_msg := SUBSTR(SQLERRM, 1, 100);
dbms_output.put_line(err_num || '---' || err_msg);
END;
四、异常传播的规则
首先,异常是会向他的外层进行传递的
即如果在当前子块中未定义异常处理,则会传递到外层的异常处理
直到异常被捕获或最终被抛弃
注:声明中的异常必定无法被当前块捕获
DECLARE
Abc number(3):='abc';
...
BEGIN
...
EXCEPTION
WHENOTHERSTHEN
...
END;----即便使用others最终也无法捕获