嵌入SQL中(DB2)异常处理WHENEVER语句的使用
2013-01-24 16:20
281 查看
WHENEVER语句用于异常处理,这里的异常包括:ERROR、EXCEPTION、WARNING。
这个异常的处理,主要是检查SQLSTATE和SQLCODE这两个保存SQL运行状态的值。
语法格式为:
WHENEVER语句的作用域:
一个程序中可以出现多个WHENEVER语句,若程序中只有一个WHENEVER语句,
其作用域为从其出现的地方到程序结束;若有多个异常处理语句,上一个语句的作用域为,
从其定义到遇到下一个异常处理语句为止。
能够处理的情况(condition)分三种:
SQLWARNING:在处理数据的过程中,如数据被截取,或数字四舍五入之类的,将会出现警告,
此时:SQLCODE>0 and SQLCODE!=100,SQLWARN0=W,SUBSTR(SQLSTATE,1,2)='01'
SQLERROR:当SQL语句写的不正确或者其他异常情况发生的时候,
DB2就会在出现错误的地方给SQLCODE,SQLSTATE赋值:SQLCODE<0,SUBSTR(SQLSTATE,1,2)>'02'
NOT FOUND:常见于从游标中读取数据,为了处理读取到最后一条数据之后的处理;
也可以用在UPDATE,DELETE,INSERT语句之后判断,这种情况下表示没有数据受到影响。
此时:SQLCODE=100,SQLSTATE='02000'。
对于上面的这三种异常,可以采取的行动(action)为:
CONTINUE:继续处理接下来的程序代码,忽略此异常。
GOTO label:对异常进行处理,label类似于JAVA中定义的catch部分,进行异常处理。
如在RPGLE程序中嵌入SQL,游标处理当中,可以对NOT FOUND异常进行处理:
WHENEVER NOT FOUND GOTO CLOS1,在CLOS1部分关闭此游标。
eg:
没执行一条SQL语句,DB2都会给他们赋值,正确反应当前SQL执行的状态,失败了?成功了?警告了?
所以我们在没执行一条SQL之后,最好通过检查其SQLCODE和SQLSTATE来确认其是否符合业务逻辑。
--the end--
这个异常的处理,主要是检查SQLSTATE和SQLCODE这两个保存SQL运行状态的值。
语法格式为:
EXEC SQL WHENEVER condition action END-EXEC
WHENEVER语句的作用域:
一个程序中可以出现多个WHENEVER语句,若程序中只有一个WHENEVER语句,
其作用域为从其出现的地方到程序结束;若有多个异常处理语句,上一个语句的作用域为,
从其定义到遇到下一个异常处理语句为止。
能够处理的情况(condition)分三种:
SQLWARNING:在处理数据的过程中,如数据被截取,或数字四舍五入之类的,将会出现警告,
此时:SQLCODE>0 and SQLCODE!=100,SQLWARN0=W,SUBSTR(SQLSTATE,1,2)='01'
SQLERROR:当SQL语句写的不正确或者其他异常情况发生的时候,
DB2就会在出现错误的地方给SQLCODE,SQLSTATE赋值:SQLCODE<0,SUBSTR(SQLSTATE,1,2)>'02'
NOT FOUND:常见于从游标中读取数据,为了处理读取到最后一条数据之后的处理;
也可以用在UPDATE,DELETE,INSERT语句之后判断,这种情况下表示没有数据受到影响。
此时:SQLCODE=100,SQLSTATE='02000'。
对于上面的这三种异常,可以采取的行动(action)为:
CONTINUE:继续处理接下来的程序代码,忽略此异常。
GOTO label:对异常进行处理,label类似于JAVA中定义的catch部分,进行异常处理。
如在RPGLE程序中嵌入SQL,游标处理当中,可以对NOT FOUND异常进行处理:
WHENEVER NOT FOUND GOTO CLOS1,在CLOS1部分关闭此游标。
eg:
*异常处理 C/EXEC SQL WHENEVER NOT FOUND GOTO CLOS1 C/END-EXEC ... *处理游标 C/EXEC SQL DECLARE C1 CURSOR FOR SELECT ... C/END-EXEC ... *异常处理:关闭游标 C CLOS1 TAG C/EXEC SQL CLOSE C1 C/END-EXEC ...关于SQLCODE和SQLSTATE的值:
没执行一条SQL语句,DB2都会给他们赋值,正确反应当前SQL执行的状态,失败了?成功了?警告了?
所以我们在没执行一条SQL之后,最好通过检查其SQLCODE和SQLSTATE来确认其是否符合业务逻辑。
--the end--
相关文章推荐
- 安卓开发SQlite使用执行SQL语句一些简单的处理——2.查询数据库的数据
- Oracle的小笔记,模糊处理人名,电话,地址之类字段数据时可以使用的SQL语句
- 动态sql语句 异常处理
- C#使用预处理SQL语句访问MySQL的方法(Parameter)
- java异常处理-finally中使用return和throw语句
- 使用预处理PreparedStatement执行Sql语句
- using语句下使用SqlDataReader异常:Invalid attempt to Read when reader is closed
- 不使用动态sql语句,正确书写case when中的null处理
- C#中使用SQL语句生成DataTable,对不同的数据库,处理方式不同,返回的结果属性不同
- 《Java Puzzlers》学习笔记之异常处理:finally中使用跳转语句的后果
- 关于spring整合hibernate使用update无异常但没有效果(不输出sql语句)
- 使用BizTalk Server的Sql适配器出现“新事务不能登记到指定的事务处理器中”异常的处理
- 使用 gvim 处理sql语句
- C#使用预处理SQL语句访问MySQL的方法(Parameter)
- SQL 教程数据库包括:Oracle, Sybase, SQL Server, DB2, Access 等等,您将学到如何使用 SQL 访问和处理数据系统中的数据
- db2使用sql语句查询表的字段类型
- mysql 事务处理,事务操作,JDBC中事务的使用,事务的sql语句,
- 异常处理try...catch(sql 2005版本以上可以使用)
- Swift中使用do-catch语句进行异常处理
- Hibernate中使用SQL处理复杂的查询语句(on calsue)