1.概述
(1)异常:指PL/SQL的运行时错误。
(2)任何PL/SQL块都可以有一个异常处理块,其中可以包含一个或多个异常处理器,格式:
EXCEPTION
when ex1 then 语句1
when ex2 or ex3 then 语句2
when others then 语句3
(3)异常类型:内置异常;自定义异常。
A:内置异常
它是以ora-n的错误;如果发生这类错误,系统会隐式的抛出。常见:no_data_found|too_many_rows|zero_divide|value_error等。
B:自定义异常
可用 ex_name EXCEPTION进行定义;必须显示抛出。
2.异常声明
(1)内置的异常,无需声明,可直接使用;自定义异常需要单独声明。
(2)声明语法:
ex_name EXCEPTION
(3)关联异常与错误代码
PRAGMA EXCEPTION_INIT(ex_name,error_code)
3.异常抛出
(1)RAISE
raise:将当前捕获到的异常原样抛出。
raise ex_name:将抛出名为ex_name的异常。
(2)RAISE_application_error(用于未命名的自定义异常,将错误编号和错误文本关联起来)
作用:用于未命名的自定义异常,将错误编号和错误文本关联起来。
格式:raise_application_error(error_code,message);或 raise_application_error(erro_code,message,keep_errors);
error_code:错误编码,范围在-20999到-20000之间。
message:错误文本,最多包含2048个字符。
keep_errors:它是Boolean参数,为True时,新错误被添加到已经抛出的错误列表中;为false时,新错误会替换已经抛出的错误栈。
4.异常处理
- 预定义异常
定义部分:异常名称 Exception;
PRAGMA EXCEPTION_INIT(错误名,- 错误代码); 将错误名称、错误代码关联起来。
异常处理:
when 错误名 then
语句块; - 自定义异常
定义部分:异常名称 Exception;
抛出异常:Raise 异常名称;
异常处理:
when 异常名称 then
语句块;
5.自定义异常示例
自定义异常示例一:
declare
--1.声明异常
e_invalid_id exception;
v_num number:=1;
begin
if v_num =1 then
raise e_invalid_id;--2.抛出异常
end if;
Exception
when e_invalid_id then --3.发生异常时处理
dbms_output.put_line('My first exception!');
end;
示例二:
--自定义异常
DECLARE
xiao_dog EXCEPTION;--声明部分
n_num NUMBER(2):=10;
BEGIN
IF n_num=10 THEN RAISE xiao_dog; --通过raise 异常名来抛出异常
END IF;
EXCEPTION
WHEN xiao_dog THEN --发生异常时做什么
dbms_output.put_line(' xiao_dog exception ......');
END;
Raise_application_error示例:
declare
v_num number:=1;
begin
if v_num =1 then
raise_application_error(-20001,'错误文本区域,这是第二个错误。');
end if;
Exception
when others then
raise;
end;
exception_init示例:
declare
v_zip zipcode.zip%type:=&sv_zip;
e_child_exists exception;
pragma exception_init(e_child_exists,-2292);
begin
delete from zipcode where zip=v_zip;
dbms_output.put_line('zip'||v_zip||' has been deleted');
commit;
Exception
when e_child_exists then
dbms_output.put_line('Delete students for this zipcode first');
end;
6.异常传播
内部块的异常如果有没有异常处理部分,直接跳转到外部块中的异常处理部分;如果内部块中有异常处理部分,先执行内部异常处理,再跳到外部块,继续执行外部块里的内容。
声明处发生异常会直接跳转到此块所属块的异常处理部分;如果没有就直接转到主机环境。
7.异常内置函数
SQLCODE:返回错误编号
SQLERRM:返回错误信息,错误信息最大长度为512字节。
示例:
declare
v_student_id number:=101;
v_name varchar2(30);
begin
select rtrim(first_name)||' '||rtrim(last_name) into v_name from student where student_id=v_student_id;
Exception
when others then
dbms_output.put_line('错误代码:'||SQLCODE);
dbms_output.put_line('错误文本:'||substr(SQLERRM,1,200));
end;