在pl/sql的执行过程中发生异常时系统所作的处理称为一个例外情况(exception)。通常例外情况的种类有三种;
①预定义的oracle例外情况,oracle预定义的例外情况大约有24个,对于这种例外情况无须再程序中定义,有oracle自动触发。(重点)
②非预定义的oracle例外情况由使用者增加定义例外情况,然后oracle自动将其触发。
③自定义例外,这个用的较少。
|
n 例外传递
如果不处理例外我们看看出出血什么情况:
案例:编写一个过程,可接受雇员的编号,并显示该雇员的姓名。
问题是:如果输入的雇员编号不存在,怎样去处理?
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;
n 常用的预定义例外
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 |
游标没有打开 |