异常抛出问题
错误处理机制
Oacle中对运行时错误的处理采用了异常处理机制。
一个错误对应一个异常,当错误产生时抛出相应的异常,并被异常处理器捕获,
程序控制权传递给异常处理器,由异常处理器来处理运行时错误。
异常的类型
- 预定义的Oracle异常( Oracle错误)
- 非预定义的Oracle异常( Oracle错误)
- 用户定义的异常(用户定义错误)
预定义的Oracle异常
异常情况名 错误代码 描述
CURSOR_ALREADY_OPEN ORA-06511 尝试打开已经打开的游标
INVALID_CURSOR ORA-01001 不合法的游标操作(如要打开已经关闭的游标)
NO_DATA_FOUND ORA-01403 没有发现数据
TOO_MANY_ROWS ORA-01422 一个SELECT INTO语句匹配多个数据行
INVALID_NUMBER ORA-01722 转换成数字失败 (‘X’)
VALUE_ERROR ORA-06502 截断、算法或转换错误,通常出现在赋值错误
ZERO_DIVIDE ORA-01476 除数为0
ROWTYPE_MISMATCH ORA-06504 主机游标变量与PL/SQL游标变量类型不匹配
DUP_VAL_ON_INDEX ORA-00001 违反唯一性约束或主键约束
SYS_INVALID_ROWID ORA-01410 转换成ROWID失败
TIMEOUT_ON_RESOURCE ORA-00051 在等待资源中出现超时
LOGIN_DENIED ORA-01017 无效用户名/密码
CASE_NOT_FOUND ORA-06592 没有匹配的WHEN子句
NOT_LOGGED_ON ORA-01012 没有与数据库建立连接
STORAGE_ERROR ORA-06500 PL/SQL内部错误
PROGRAM_ERROR ORA-06501 PL/SQL内部错误
ACCESS_INTO_NULL ORA-06530 给空对象属性赋值
COLLECTION_IS_NULL ORA-06531 对某NULL PL/SQL表或可变数组试图应用集合方法,而不是EXISTS
SELF_IS_NULL ORA-30625 调用空对象实例的方法
SUBSCRIPT_BEYOND_COUNT ORA-06533 对嵌套表或数组索引引用时超出集合中元素的数量
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 对嵌套表或可变数组索引的引用超出声明的范围
非预定义异常
有一些Oracle错误没有预定义异常与其关联,
需要在语句块的声明部分声明一个异常名称,
然后通过编译指示PRAGMA EXCEPTION_INIT将该异常名称与一个Oracle错误相关联。
此后,当执行过程出现该错误时将自动抛出该异常。
声明一个异常名称
e_integrity EXCEPTION;
将异常与一个Oracle错误号相绑定
PRAGMA EXCEPTION-INIT(e_integrity,-2291)
示例
DECLARE
e_deptno_fk EXCEPTION;
PRAGMA EXCEPTION_INIT(e_deptno_fk,-2292);
BEGIN
……
EXCEPTION
……
END;
用户自定义的异常
用户定义错误是指,有些操作并不会产生Oracle错误,但是从业务规则角度考虑,认为是一种错误。
用户自定义异常必须在声明部分进行声明。
当异常发生时,系统不能自动触发,需要用户使用RAISE语句。
WHEN EXCEPTION_NAME THEN
RAISE user_define_exception;
在异常处理部分捕捉并处理异常。
Oracle内部错误号用一个负的5位数表示,如-02292。其中
-20999~-20000为用户定义错误的保留号
异常的捕获
EXCEPTION
WHEN exception1[OR excetpion2…]THEN
sequence_of_statements1;
WHEN exception3[OR exception4…]THEN
sequence_of_statements2;
……
WHEN OTHERS THEN
sequence_of_statementsn;
END;
所有未处理的异常由OTHERS处理