如何在sql存储过程中处理错误
下面将如何在存储过程中判断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;
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器