系统异常
异常(EXCEPTION)是一种PL/SQL标识符,如果运行PL/SQL块时出现错误或警告,则会触发异常。
当触发异常时,默认情况下会终止PL/SQL块的执行。
通过在PL/SQL块中引入异常处理部分,可以捕捉各种异常,并根据异常出现的情况进行相应的处理。
异常类型
- 预定义异常
- 非预定义异常
- 用户自定义异常
语法
EXCEPTION
WHEN 错误1 [OR 错误2] THEN 语句序列1;
WHEN 错误3 [OR 错误4] THEN 语句序列2;
...
[WHEN OTHERS THEN 语句序列n;]
处理原则
- 程序块出现错误,无条件转移到异常处理部分
- 进入异常处理部分,不会再转到相同块的可执行部分
- WHEN OTHERS then从句放置在所有其他异常处理从句的后面,最多只能有一个WHEN OTHERS then 从句。
用户自定义异常
用户自行设定的异常警告
在实际的程序开发中,为了实施具体的业务逻辑规则,程序开发人员往往会根据这些逻辑规则自定义一些异常。当用户进行操作时违反了这些规则,就会引发一个自定义异常,从而中断程序的正常执行,并转到自定义异常处理部分。
异常处理三步走
- 定义异常
- 抛出异常
- 异常处理
语法结构
定义异常的语法:
异常名 EXCEPTION;
例如:
DECLARE
my_exception EXCEPTION;
异常触发
触发自定义异常。
触发异常的语法:
RAISE 异常名;
例如:
BEGIN
IF v_salary=0 THEN
RAISE my_exception;
END IF;
End;
异常处理
处理异常的语法:
WHEN 异常名 THEN 处理语句;
例如:
EXCEPTION
WHEN my_exception THEN
DBMS_OUTPUT.PUT_LINE(‘工资为0’);
例题辨析
编写一个PL/SQL程序,查询学生表中当前学生总人数,并根据总人数进行判定。
(1)如果人数>100,则触发异常e_big。异常处理时输出:“学生过多,请缩减招生”。
(2)如果人数<20,则触发异常e_small。异常处理时输出:“学生过少,请扩大招生”。
(3)否则人数在20至100之间,无须触发异常。直接输出当前人数即可。
declare
s_num number;
e_big exception;
s_small exception;
begin
select count(*) into s_num form student;
if s_num >100 then
raise e_big;
elsif e_num then
raise e_small;
else
dbms_output.put_line("学生总人数:" || s_num);
end if;
exception
when e_big then
dbms_output.put_line("学生过多,请缩减招生");
when s_small then
dbms_output.put_line("学生过多,请扩大招生");
end;