pl/sql进阶——例外处理

在pl/sql的执行过程中发生异常时系统所作的处理称为一个例外情况(exception)。通常例外情况的种类有三种;

①预定义的oracle例外情况,oracle预定义的例外情况大约有24个,对于这种例外情况无须再程序中定义,有oracle自动触发。(重点)

②非预定义的oracle例外情况由使用者增加定义例外情况,然后oracle自动将其触发。

③自定义例外,这个用的较少。

 
 

exception

when  <异常情况明> then

<异常处理代码>

when <异常情况明> then

<异常处理代码>

......

when others then

<异常处理代码>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

例外传递

如果不处理例外我们看看出出血什么情况:

案例:编写一个过程,可接受雇员的编号,并显示该雇员的姓名。

问题是:如果输入的雇员编号不存在,怎样去处理?

 

create or replace procedure pro6(v_in_empno number) is

v_ename varchar2(32);

begin

  select ename into v_ename from emp where empno=v_in_empno;

  dbms_output.put_line('姓名是:'||v_ename);

  exception

    when no_data_found then

      dbms_output.put_line('朋友,你输入的编号不存在');

    when others then

      dbms_output.put_line('不明错误');

end;

 

 

常用的预定义例外

oracle预定义例外情况的处理,下面列出常见的几个

 

例外情况明

错误代码

描述

NO_DATA_FOUND

ORA-01403

对于select叙述没有传回任何值

TOO_MANY_ROWS

ORA-01427

只允许传回一笔记录的select叙述结果多于一笔

INVALID_CURSOR

ORA-01001

使用非法的光标操作

VALUE_ERROR

ORA-06502

出现数值、数据形态转换、攫取字符串或强制性的错误。

INVALID_NUMBER

ORA-01722

字符串到数值的转换失败。

ZERO_DIVIDE

ORA-01476

被零除

DUP_VAL_ON_INDEX

ORA-00001

视图向具有唯一键值的索引中插入一个重复值。

CASE_NOT_FOUND

ORA-06592

没有case条件匹配

CURSOR_NOT_OPEN

ORA-06511

游标没有打开

上一篇:oracle强制索引失效


下一篇:9、oracle表查询关键字