oracle 存储过程 异常处理机制
下面将如何在存储过程中判断SQL语句的错误,向大家作一个详细地介绍, 希望大家让程序开发人员遵从这样的方式编写SQL存储过程,以避免造成在程序联调过程中应用程序状态不明确的问题。
如以下代码表示,在SQL存储过程中可以定义执行状态的出口参数,而且尽量返回系统报告的SQLCODE, 而并非个人定义的,这样可以更好地判断是什么样的错误, 也可以返回错误说明,有的开发人员不知何故,将返回码定义成79700,如果是参照DB2说明开发的,可能是误会了说明的含义,这个问题已经造成了联调过程中的误导判断和无法确定问题的原因,希望大家注意;
如果需要忽略NOT FOUND, 可以DECLARE CONTINUE HANDLER FOR NOT FOUND, 如果需要并且可以将returnCode设置为零,以便于在程序体内判断returnCode的时候可以忽略这个NOT FOUND;
可以定义DECLARE EXIT HANDLER FOR SQLEXCEPTION, 当出现SQL错误的时候,中断程序执行过程,跳出存储过程,也可以定义DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, 同时判断SQLCODE的值,用以忽略你希望忽略的error code, 在程式的最后列出了这种使用方式:
CREATE PROCEDURE OUT_LANGUAGE (...,OUT returnCode INTEGER, OUT returnMsg CHAR(32)) 
-- returnCode 返回执行中的的错误代码 
-- returnMsg 返回执行中的的错误描述 
SPECIFIC SQL_OUT_LANGUAGE 
LANGUAGE SQL 
BEGIN 
   DECLARE SQLCODE INTEGER DEFAULT 0; 
   DECLARE SQLSTATE CHAR(5) DEFAULT ´00000´; 
   DECLARE errorLabel CHAR(32) DEFAULT ´´; 
   ...... 
   -- in case of no data found   
   DECLARE CONTINUE HANDLER FOR NOT FOUND 
     BEGIN 
       SET returnCode = SQLCODE; 
-- 也可以设置为 SET returnCode = 0; 因为这个DECLARE是为了忽略NOT FOUND的执行结果 
     END; 
   -- in case of SQL error 
   DECLARE EXIT HANDLER FOR SQLEXCEPTION 
     BEGIN 
       SET returnCode = SQLCODE; 
       SET returnMsg = errorLabel; 
     END; 
......
对于SQLEXCEPTION也可以这样定义,用来忽略一些特定的error code, 但是要在程序体内判断returnCode的数值: 
   -- in case of SQL error 
   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
     BEGIN 
       IF (SQLCODE = -454) THEN 
          SET returnCode = 0; 
-- 创建的数据库对象已经存在或者插入的记录在唯一键值上重复 
       ELSE 
          SET returnCode = SQLCODE; 
          SET returnMsg = errorLabel; 
       END IF; 
     END; 
...... 
IF (returnCode = 0) THEN 
     ...... 
END IF; 
IF (returnCode = 0) THEN 
     ... 
END IF; 
END 
--存储过程结束
dwd_china 回复于:2005-08-23 09:20:16  
在存储过程的后面加上这样的异常处理就可以了 
EXCEPTION 
   ----错误处理 
   WHEN DUP_VAL_ON_INDEX THEN 
     ----主键冲突 
     ROLLBACK; 
   WHEN VALUE_ERROR THEN 
     ----长度截断错误 
     ROLLBACK; 
   WHEN PROGRAM_ERROR THEN 
     ----PL/SQL内部错误 
     ROLLBACK; 
   WHEN TIMEOUT_ON_RESOURCE THEN 
     ----系统等待超时 
       ROLLBACK; 
   WHEN OTHERS THEN 
     ----其他异常错误 
     ROLLBACK; 
     TRACKBACK:http://www.kpwang.com/ibm_db2/110642311549.htm
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号