pl/sql 常见异常

转载自 http://zhangbq168.blog.163.com/blog/static/23735305200849111927826/

 

 

 

 

要控制其它Oracle异常,我们可以使用OTHERS处理器。函数SQLCODE和SQLERRM在OTHERS处理器中特别有用,因为它们能返回Oracle错误编号和消息。另外,我们还可以使用编译指示(pragma)EXCEPTION_INIT把一个异常名称和一个Oracle错误编号关联起来。PL/SQL在STANDARD包中声明了全局预定义异常。所以,我们不需要自己声明它们。我们可以为下面列表中命名的预定义异常编写处理程序:

异常Oracle错误号SQLCODE值
ACCESS_INTO_NULLORA-06530-6530
CASE_NOT_FOUNDORA-06592-6592
COLLECTION_IS_NULLORA-06531-6531
CURSOR_ALREADY_OPENORA-06511-6511
DUP_VAL_ON_INDEXORA-00001-1
INVALID_CURSORORA-01001-1001
INVALID_NUMBERORA-01722-1722
LOGIN_DENIEDORA-01017-1017
NO_DATA_FOUNDORA-01403100
NOT_LOGGED_ONORA-01012-1012
PROGRAM_ERRORORA-06501-6501
ROWTYPE_MISMATCHORA-06504-6504
SELF_IS_NULLORA-30625-30625
STORAGE_ERRORORA-06500-6500
SUBSCRIPT_BEYOND_COUNTORA-06533-6533
SUBSCRIPT_OUTSIDE_LIMITORA-06532-6532
SYS_INVALID_ROWIDORA-01410-1410
TIMEOUT_ON_RESOURCEORA-00051-51
TOO_MANY_ROWSORA-01422-1422
VALUE_ERRORORA-06502-6502
ZERO_DIVIDEORA-01476-1476

 

预定义异常的简要描述:

异常抛出时机
ACCESS_INTO_NULL程序尝试为一个未初始化(自动赋为null)对象的属性赋值。
CASE_NOT_FOUNDCASE语句中没有任何WHEN子句满足条件,并且没有编写ELSE子句。
COLLECTION_IS_NULL程序尝试调用一个未初始化(自动赋为null)嵌套表或变长数组的集合方法(不包括EXISTS),或者是程序尝试为一个未初始化嵌套表或变长数组的元素赋值。
CURSOR_ALREADY_OPEN程序尝试打开一个已经打开的游标。一个游标在重新打开之前必须关闭。一个游标FOR循环会自动打开它所引用的游标。所以,我们的程序不能在循环内部打开游标。
DUP_VAL_ON_INDEX程序尝试向一个有着唯一约束条件的数据库字段中保存重复值。
INVALID_CURSOR程序尝试操作一个不合法的游标,例如关闭一个未打开的游标。
INVALID_NUMBER在一个SQL语句中,由于字符串并不代表一个有效的数字,导致字符串向数字转换时会发生错误。(在过程化语句中,会抛出异常VALUE_ERROR。)当FETCH语句的LIMIT子句表达式后面不是一个正数时,这个异常也会被抛出。
LOGIN_DENIED程序尝试使用无效的用户名和/或密码来登录Oracle。
NO_DATA_FOUNDSELECT INTO语句没有返回数据,或者是我们的程序引用了一个嵌套表中被删除了的元素或是索引表中未初始化的元素。SQL聚合函数,如AVG和SUM,总是能返回一个值或空。所以,一个调用聚合函数的SELECT INTO语句从来不会抛出NO_DATA_FOUND异常。FETCH语句最终会取不到数据,当这种情况发生时,不会有异常抛出的。
NOT_LOGGED_ON程序没有连接到Oracle就要调用数据库。
PROGRAM_ERRORPL/SQL程序发生内部错误。
ROWTYPE_MISMATCH赋值语句中使用的主游标变量和PL/SQL游标变量的类型不兼容。例如,当一个打开的主游标变量传递到一个存储子程序时,实参的返回类型和形参的必须一致。
SELF_IS_NULL程序尝试调用一个空实例的MEMBER方法。也就是内置参数SELF(它总是第一个传递到MEMBER方法的参数)是空。
STORAGE_ERRORPL/SQL运行时内存溢出或内存不足。
SUBSCRIPT_BEYOND_COUNT程序引用一个嵌套表或变长数组元素,但使用的下标索引超过嵌套表或变长数组元素总个数。
SUBSCRIPT_OUTSIDE_LIMIT程序引用一个嵌套表或变长数组,但使用的下标索引不在合法的范围内(如-1)。
SYS_INVALID_ROWID从字符串向ROWID转换发生错误,因为字符串并不代表一个有效的ROWID。
TIMEOUT_ON_RESOURCE当Oracle等待资源时,发生超时现象。
TOO_MANY_ROWSSELECT INTO语句返回多行数据。
VALUE_ERROR发生算术、转换、截位或长度约束错误。例如,当我们的程序把一个字段的值放到一个字符变量中时,如果值的长度大于变量的长度,PL/SQL就会终止赋值操作并抛出异常VALUE_ERROR。在过程化语句中,如果字符串向数字转换失败,异常VALUE_ERROR就会被抛出。(在SQL语句中,异常INVALID_NUMBER会被抛出。)
ZERO_DIVIDE程序尝试除以0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值