异常抛出问题

错误处理机制

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处理

猜你喜欢

转载自www.cnblogs.com/mobai95/p/12516763.html