PL/SQL支持程序员在程序中使用异常块捕获程序运行
中出现的错误等异常信息,分为:
Ø 系统定义的异常
Ø 用户定义的异常
系统级异常
--语法如下:
beginexceptionwhen 异常名then 语句...when others then 语句...end;
以下是oracle数据库中系统定义好的异常的名称和产生的原因:
异常名 | 原因 |
ACCESS_INTO_NULL | 当一个空对象会自动分配一个值引发此异常 |
CASE_NOT_FOUND | 当没有任何选择,在当选择一个CASE语句的子句且没有ELSE子句时被引发 |
COLLECTION_IS_NULL | 当程序试图申请其他收集方法不是存在未初始化的嵌套表或VARRAY,或程序试图值分配给未初始化的嵌套表或变长数组的元素时被引发 |
DUP_VAL_ON_INDEX | 当重复值试图被存储在具有唯一索引的列时被引发 |
INVALID_CURSOR | 当尝试以使这是不允许的,如关闭一个未打开的游标的游标操作时被引发 |
INVALID_NUMBER | 当一个字符串转换成一个数失败,因为字符串不表示一个有效的数据被引发 |
LOGIN_DENIED | 当程序试图登录到数据库使用无效的用户名或密码被引发 |
NO_DATA_FOUND | 它被引发当一个SELECT INTO语句无任何行返回 |
NOT_LOGGED_ON | 在不连接到数据库发出数据库调用它被引发 |
PROGRAM_ERROR | 它被引发当PL/SQL有一个内部问题 |
ROWTYPE_MISMATCH | 当游标取值有不兼容的数据类型的变量被引发 |
SELF_IS_NULL | 它被引发,当对象的成员方法被调用,但对象类型的实例没有被初始化。 |
STORAGE_ERROR | 它被引发当PL/SQL内存不足或内存已损坏 |
TOO_MANY_ROWS | 它被引发当SELECT INTO语句返回多行 |
VALUE_ERROR | 当算术,转换,截短,或大小约束错误时引发 |
ZERO_DIVIDE | 它被引发当一个数试图除以零。 |
案例:
查询部门表中有某个编号的部门,给其一个不存在的编号来演示NO_DATA_FOUND异常:该异常在SELECT INTO语句查询不到结果时触发.
另外给其一个能够返回多个行记录的编码来演示TOO_MANY_ROWS异常:该异常在SELECT INTO语句查询后返回多个行记录时触发.
declare dnum number:=60; depts dept%rowtype; dna dept.dname%type;beginselect * into depts.deptno,dna,depts.loc from dept where deptno>dnum; dbms_output.put_line('部门编号:'||depts.deptno||',部门名称:'||dna||',城 市:'||depts.loc);exception when NO_DATA_FOUND then dbms_output.put_line('没有查找到数据'); when TOO_MANY_ROWS then dbms_output.put_line('返回了多个行记录'); when others then dbms_output.put_line('其他异常');end;
自定义异常
自定义异常需要现在declare中声明,类型为exception类型,然后需要在begin中给其设置触发条件,然后就可以在exception后的when中使用.
自定义异常三步骤:
1.declare中定义异常
2.begin中设置触发条件,由raise关键字触发.注: raise中文发音:瑞爱Z
3.exception中使用
案例:查询指定id的员工名字来演示自定义异常
declare cid number:=-1; cname emp.ename%type; ex_invalid_id exception; ---1.定义异常beginif cid <0 then ---2.设定触发条件 raise ex_invalid_id; end if; select ename into cname from emp where empno=cid; dbms_output.put_line('员工名字为:'||cname);exception when ex_invalid_id then ---3.使用异常 dbms_output.put_line('id不可用,不能为负数'); when no_data_found then dbms_output.put_line('未查到任何数据'); when others then dbms_output.put_line('其他异常,请联系管理员');end;