下面将如何在存储过程当中判断SQL语句的错误,向你们做一个详细地介绍, 但愿你们让程序开发人员听从这样的方式编写SQL存储过程,以免形成在程序联调过程当中应用程序状态不明确的问题。数据库
如如下代码表示,在SQL存储过程当中能够定义执行状态的出口参数,并且尽可能返回系统报告的SQLCODE, 而并不是我的定义的,这样能够更好地判断是什么样的错误, 也能够返回错误说明,有的开发人员不知何故,将返回码定义成79700,若是是参照DB2说明开发的,多是误会了说明的含义,这个问题已经形成了联调过程当中的误导判断和没法肯定问题的缘由,但愿你们注意; spa
若是须要忽略NOT FOUND, 能够DECLARE CONTINUE HANDLER FOR NOT FOUND, 若是须要而且能够将returnCode设置为零,以便于在程序体内判断returnCode的时候能够忽略这个NOT FOUND; pwa
能够定义DECLARE EXIT HANDLER FOR SQLEXCEPTION, 当出现SQL错误的时候,中断程序执行过程,跳出存储过程,也能够定义DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, 同时判断SQLCODE的值,用以忽略你但愿忽略的error code, 在程式的最后列出了这种使用方式: 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 ´´;
...... htm
-- 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; blog
...... 开发
对于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;
...... get
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