异常处理基本语法
任何一种编程语言中的异常处理部分都是比较重要的一部分,单独学习一下。
一、异常的种类及基本用法:
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最终也无法捕获