ORACLE中的系统预定义异常
可以在SQL块中使用EXCEPTION来捕捉异常并且进行处理。Oracle预定义的21个系统异常,如果定义异常能够满足要求,就可以使用他们。如果不满足,则可以定义自己的异常,并且可以使用RAISE EXCEPTION来抛出异常。
序号 | 系统异常名称 | 产生原因 |
---|---|---|
1 | ACCESS_INTO_NULL | 未定义对象 |
2 | CASE_NOT_FOUND | CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时 |
3 | COLLECTION_IS_NULL | 集合元素未初始化 |
4 | CURSER_ALREADY_OPEN | 游标已经打开 |
5 | DUP_VAL_ON_INDEX | 唯一索引对应的列上有重复的值 |
6 | INVALID_CURSOR | 在不合法的游标上进行操作 |
7 | INVALID_NUMBER | 内嵌的 SQL 语句不能将字符转换为数字 |
8 | NO_DATA_FOUND | 使用 select into 未返回行,或应用索引表未初始化的元素时 |
9 | TOO_MANY_ROWS | 执行 select into 时,结果集超过一行 |
10 | ZERO_DIVIDE | 除数为 0 |
11 | SUBSCRIPT_BEYOND_COUNT | 元素下标超过嵌套表或 VARRAY 的最大值 |
12 | SUBSCRIPT_OUTSIDE_LIMIT | 使用嵌套表或 VARRAY 时,将下标指定为负数 |
13 | VALUE_ERROR | 赋值时,变量长度不足以容纳实际数据 |
14 | LOGIN_DENIED | PL/SQL 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码 |
15 | NOT_LOGGED_ON | PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据 |
16 | PROGRAM_ERROR | PL/SQL 内部问题,可能需要重装数据字典& pl./SQL 系统包 |
17 | ROWTYPE_MISMATCH | 宿主游标变量与 PL/SQL 游标变量的返回类型不兼容 |
18 | SELF_IS_NULL | 使用对象类型时,在 null 对象上调用对象方法 |
19 | STORAGE_ERROR | 运行 PL/SQL 时,超出内存空间 |
20 | SYS_INVALID_ID | 无效的 ROWID 字符串 |
21 | TIMEOUT_ON_RESOURCE | Oracle 在等待资源时超时 |
对应的错误代码:
大部分错误用负号作为错误号,可以使用SQLCODE内置函数看到错误代码,使用SQLERRM得到异常的内置消息。
序号 | 异常 | 错误代码 | 何时出现 |
---|---|---|---|
1 | ACCESS_INTO_NULL | ORA-06530 | 试图访问未初始化对象的时候出现 |
2 | CASE_NOT_FOUND | ORA-06592 | 如果定义了一个没有ELSE子句的CASE语句,而且没有CASE语句满足运行时条件时出现该异常 |
3 | COLLECTION_IS_NULL | ORA-06531 | 当程序去访问一个没有进行初始化的NESTED TABLE或者是VARRAY的时候,会出现该异常 |
4 | CURSOR_ALREADY_OPEN | ORA-06511 | 游标已经被OPEN,如果再次尝试打开该游标的时候,会出现该异常 |
5 | DUP_VAL_ON_INDEX | ORA-00001 | 如果插入一列被唯一索引约束的重复值的时候,就会引发该异常(该值被INDEX认定为冲突的) |
6 | INVALID_CURSOR | ORA-01001 | 不允许的游标操作,比如关闭一个已经被关闭的游标,就会引发 |
7 | INVALID_NUMBER | ORA-01722 | 给数字值赋非数字值的时候,该异常就会发生,这个异常也会发生在批读取时候LIMIT子句返回非正数的时候 |
8 | LOGIN_DENIED | ORA-01017 | 程序中,使用错误的用户名和密码登录的时候,就会抛出这个异常 |
9 | NO_DATA_FOUND | ORA_06548 | 在使用SELECT INTO 结构,并且语句返回NULL值的时候;访问嵌套表中已经删除的表或者是访问INDEX BY表(联合数组)中的未初始化元素就会出现该异常 |
10 | NOT_LOGGED_ON | ORA-01012 | 当程序发出数据库调用,但是没有连接的时候(通常,在实际与会话断开连接之后) |
11 | PROGRAM_ERROR | ORA-06501 | 当Oracle还未正式捕获的错误发生时常会发生,这是因为数据库大量的Object功能而发生 |
12 | ROWTYPE_MISMATCH | ORA-06504 | 如果游标结构不适合PL/SQL游标变量或者是实际的游标参数不同于游标形参的时候发生该异常 |
13 | SELF_IS_NULL | ORA-30625 | 调用一个对象类型非静态成员方法(其中没有初始化对象类型实例)的时候发生该异常 |
14 | STORAGE_ERROR | ORA-06500 | 当内存不够分配SGA的足够配额或者是被破坏的时候,引发该异常 |
15 | SUBSCRIPT_BEYOND_COUNT | ORA-06533 | 当分配给NESTED TABLE或者VARRAY的空间小于使用的下标的时候,发生该异常(类似于java的ArrayIndexOutOfBoundsException) |
16 | SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | 使用非法的索引值来访问NESTED TABLE或者VARRAY的时候引发 |
17 | SYS_INVALID_ROWID | ORA-01410 | 将无效的字符串转化为ROWID的时候引发 |
18 | TIMEOUT_ON_RESOURCE | ORA-00051 | 当数据库不能安全锁定资源的时候引发 |
19 | TOO_MANY_ROWS | ORA-01422 | 常见错误,在使用SELECT INTO 并且查询返回多个行时引发。如果子查询返回多行,而比较运算符为相等的时候也会引发该异常。 |
20 | USERENV_COMMITSCN_ERROR | ORA-01725 | 只可使用函数USERENV(‘COMMITSCN’)作为INSERT语句的VALUES子句中的顶级表达式或者作为UPDATE语句的SET子句中的右操作数 |
21 | VALUE_ERROR | ORA-06502 | 将一个变量赋给另一个不能容纳该变量的变量时引发 |
22 | ZERO_DIVIDE | ORA-01476 | 将某个数字除以0的时候,会发生该异常 |