您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > DB2中游标的使用以及存储过程的写法
问题1:什么时候才会发生notfound异常,以及db2中sqlcode的值是如何变化的?在db2中,一条select语句也有可能发生notfound异常,譬如declaresqlcodeintegerdefault0;declaresql_codeintegerdefault0;declareclassCodevarchar(40);selectapp_class_codeintoclassCodefromkf_app_classwhereapp_name='无效记录';setsql_code=sqlcode;如果此时没有检索到记录,那么sqlcode的值为100,有的话为0;我们可以定义NOTFOUND异常处理declaresqlcodeintegerdefault0;declaresql_codeintegerdefault0;declareclassCodevarchar(40);begindeclarecontinuehandlerfornotfoundbegin--注如果发生notfound那么此时的sqlcode必定为100setsql_code=sqlcode;/*在这里sqlcode的值为100;*/--如果再次得到sqlcode的值那么它的值变为0setsql_code=sqlcode;/*这里sqlcode变成了0,因为上一条语句执行成功了,那么sqlcode变成了0*/end;selectapp_class_codeintoclassCodefromkf_app_classwhereapp_name='无效记录';setsql_code=sqlcode;/*同理此时如果没有取到数据,那么会进declarecontinuehandler,返回后sqlcode的值也为0*/end;所以我们可以通过两种方法来捕获和处理notfound方法1:begindeclarecontinuehandlerfornotfoundbegin--异常处理代码end;sql语句end;方法2:beginsql语句ifsqlcode=100then--异常处理代码endif;end;问题2:定义了游标,怎么fecth一条记录,怎么进行循环?Q:定义了游标假设发生notfound异常,那么是在opencursorName的时候还是在fecth的时候发生异常?A:检验游标中的数据是否取完或者有无记录,应该在fecth的时候,而不是发生在opencursorName的时候,下面一个例子详细的说明了游标使用过程begindeclaresqlcodeintegerdefault0;declareapp_codevarchar(10);declarecursor1cursorforselectapp_codefromkf_app_class;opencursor1;cursorLoop:loopfecthcursor1intoapp_code;ifsqlcode=100thenleavecursorLoop;endif;endloop;end;Q:sqlcode可以直接用吗?A:在db2中,如果要使用sqlcode那么必须在使用前declare;譬如declaresqlcodeintegerdefault0;ifsqlcode=?thenendif;附注db2的其他异常处理对应oracle的whenotherexceptionsdeclareexithandlerforsqlwaring,sqlexcptionbegin--处理异常end;当程序执行exithandler异常处理后,那么会退出程序,不会在接着执行,也就是declareexithandlerforsqlwaring,sqlexcptionbegin--处理异常end;sql语句1;sql语句2;执行sql语句1发生异常,会进入exithandler,然后退出程序,不会在执行sql语句2执行sql语句1发生异常,会进入exithandler,然后退出程序,不会在执行sql语句2
本文标题:DB2中游标的使用以及存储过程的写法
链接地址:https://www.777doc.com/doc-2909489 .html