ORACLE--Function异常处理(EXCEPTION)

存储过程在抛出异常的时候可以通过下面的代码,去获取异常并把异常UPDATE到某个字段内,方便在检查数据时,查看数据抛出的异常。
WHEN OTHERS THEN
--ROLLBACK;
--获取异常信息
V_ERRCODE:= SQLCODE ;
V_ERRMSG:= SUBSTR(SQLERRM , 1, 150);
--同步存储过程出现错误 2 -- 同步失败
UPDATE PRPDRATIONCLAUSEKINDTEMP
SET STATUS = '2',ERRMSG = V_ERRMSG,ERRCODE = V_ERRCODE
WHERE RATIONCODE = CCIC_RATION_DETAIL.RATIONCODE
AND CLAUSECODE = CCIC_RATION_DETAIL.CLAUSECODE
AND KINDCODE = CCIC_RATION_DETAIL.KINDCODE;
COMMIT;


ORACLE存储过程常见异常
[quote]exception  oracle error  sqlcode value  condition
no_data_found  ora-01403  +100  select into 语句没有符合条件的记录返回
too_many_rows  ora-01422  -1422  select into 语句符合条件的记录有多条返回
dup_val_on_index  ora-00001  -1  对于数据库表中的某一列,该列已经被限制为唯一索引,程序试图存储两个重复的值
value_error  ora-06502  -6502  在转换字符类型,截取或长度受限时,会发生该异常,如一个字符分配给一个变量,而该变量声明的长度比该字符短,就会引发该异常
storage_error  ora-06500  -6500  内存溢出
zero_divide  ora-01476  -1476  除数为零
case_not_found  ora-06592  -6530  对于选择case语句,没有与之相匹配的条件,同时,也没有else语句捕获其他的条件
cursor_already_open  ora-06511  -6511  程序试图打开一个已经打开的游标
timeout_on_resource  ora-00051  -51  系统在等待某一资源,时间超时 [/quote]今天在同步数据时抛出
ORA-04062: timestamp of procedure "CCICINS.P_DODUMP_CCICINS" has been changed

错误原因:两个存储过程在互相调用时,其中一个被调用的存储过程恰好刚编译,而调用方的存储过程还没有编译,这个时间点的数据,就抛出了这个异常。
解决方案:将调用方的存储过程重新编译,重新同步数据即可解决。

抛出异常的三种方式:
由三种方式抛出异常
1、通过PL/SQL运行时引擎 
2、使用RAISE语句
3、调用RAISE_APPLICATION_ERROR存储过程
//抛出异常方式讲解
1、当数据库或PL/SQL在运行时发生错误时,一个异常被PL/SQL运行时引擎自动抛出。
2、异常也可以通过RAISE语句抛出,如:RAISE exception_name;
3、RAISE_APPLICATION_ERROR内建函数用于抛出一个异常并给异常赋予一个错误号以及错误信息
(自定义异常的缺省错误号是+1,缺省信息是User_Defined_Exception)
个人感觉前两个经常会用到,第三个好像不太常用。

部分内容来自:
[url]http://blog.csdn.net/jojo52013145/article/details/6585833[/url]

你可能感兴趣的:(ORACLE)