PL/SQL基础知识讲解之异常(EXCEPTION)

EXCEPTION(异常)

还记得pl/sql块的基本结构吗?,复习一下,如下:
DECLARE
定义区
BEGIN
执行区
EXCEPTION
异常区
END;
其中异常就是我们区块中的一部门,该篇就将简单介绍一下,关于pl/sql中异常的问题。
程序的异常处理是处理程序在执行的过程中发生的一些未预料的事件,程序块的异常处理,可以处理预定义错误,非预定义错误甚至是自定义错误,由于程序块一旦出现错误,如果没有进行处理,所有程序就会立即停止,所以对于异常的把控是非常重要的。

三种类型的错误:
(1)预定义(predefined)错误
这种异常也是我们最常见的,是之前由oracle已经定义好的,无需我们自己定义,由oracle自动引发。
常见的24中预定义错误如下表所示:
PL/SQL基础知识讲解之异常(EXCEPTION)_第1张图片
PL/SQL基础知识讲解之异常(EXCEPTION)_第2张图片
(2)非预定义错误
即其他标准的异常,对于这种异常是需要在程序中实现定义好的,然后由oralce系统引发。

(3)自定义异常
在程序的执行中,出现了编程人员认为的非正常情况,此时需要在程序中自己定义该类错误,并在程序中显示的将其引发。

下面通过实例对以上三种错误进行介绍:
先介绍一下结构:
EXCEPTION
WHEN exception01 THEN 异常处理;
WHEN exception02 THEN 异常处理;
WHEN OTHERS THEN 异常处理;

实例1(预定义异常):查询自定员工的工资信息,如果小于3000,则加100,并捕获no_data_found异常和to_many_rows异常;

declare 
v_id employees.employee_id%type := &v_id;   //使用&v_id是实现在执行的时候弹出eid的输入框,可输入参数
v_sal employees.salary%type;
begin
select salary into v_sal from employees where employee_id =v_id;
if salary <3000 then
update employees set salary = salary +300 where employee_id = v_id;
dbms_output.put_line(v_id||'工资已更新');
else 
dbms_output.put_line(v_id'工资不需要更新');
end if;
exception
when no_data_found then dbms_output.put_line('暂无此数据哦!');
when to_many_rows then dbms_output.put_line('返回多行数据,请使用游标');
when others then dbms_output.put_line('其他异常');
end; 

预定义异常很简单,不需要我们手动定义,我们只需要做好捕获就行了

实例2(非预定义异常,其他标准异常)
对于这种异常我们就需要自己手动定义了,因为我们只能得到的是错误代码。
步骤如下:
第一步,定义异常:<异常情况> EXCEPTION
第二步,将定义的异常和实际错误代码关联起来:PRAGMA EXCEPTION(<异常情况>,<错误代码>)
第三不,和预定义错误一样,捕获异常 when <异常情况> then 异常处理;

//删除指定部门的信息,但要确保该部门没有人员了,即没有外键引用了,如果还有肯定会报检查一致性异常
declare
dno departments.department_d%type := &dno;
data_remain EXCEPTION;  //定义一个数据残留异常
pragma exception_init (data_remain,-2292);  //绑定错误代码,当抛出该异常代码的异常时
//则为抛出data_remain异常
begin
delete from departments where department_id = dno;
exception
when data_remain then dbms_output.put_line('违反数据一致性原则,请重新检查');
when others then dbms_output.put_line(sqlcode||'--'||sqlerrm);  //打印错误代码和错误信息
end;

实例3(用户自定义异常)
用户自定义异常即为编程人员认为这样的数据返回是错误的应该当做异常抛出,于是自己就定义了一个异常,然后强行显示的抛出他,使用RAISE操作。
基本格式:
1.定义异常:<异常情况> EXCEPTION
2.触发异常:一般通过我们的语句判断觉得需要抛出异常就使用EAISE <异常情况>;
3.捕获异常:when <异常情况> then 处理;

//更新指定员工的工资,加100,如果该员工不存在,则抛出自定义异常no_result异常
declare
eid employees.employee_id%type &eid;
no_result EXCEPTION;
begin
update employees set salary = salary +100 where employee_id = eid;
if sql%notfound then raise no_result;
exception
when no_result then dbms_output.put_line('暂无此员工');
when others then dbms_output.put_line(sqlcode||'--'||sqlerrm);
end;

以上就是关于3种异常的定义和捕获方法,下面再简单介绍一下,刚才用到的两个关键字 sqlcode,sqlerrm
sqlcode:错误代码;
sqlerrm:错误信息;

//使用sqlcode和sqlerrm实现一个小案例吧
//将oracle错误代码及错误信息存放到错误信息表中
create table errtable(
    errcode number(4);
    errmsg varchar2(50);
)

declare
v_errmsg varchar2(50);
begin
for errnum in -100 .. 0 loop
v_errmsg := sqlerrm(errnum)
insert into errtable(errnum,v_errmsg);
end loop;
end;

基本上关于pl/sql异常的基本知识介绍到这里就结束了,如果错误欢迎大家指出,谢谢。

你可能感兴趣的:(oracle,oralce,plsql基础,数据库异常,Exception,预定义错误)