- 论坛徽章:
- 0
|
关于游标cursor的BUG???
找了点以前的关于游标的代码,你看看吧
- DB2下游标控制不是非常的轻松和方便的,同样也可以使用sqlcode,sqlstate,或者用户自己控制,DB2下SQLCODE,SQLSTATE不能直接使用,必须声明后使用,(也就是说将系统的SQLCODE,SQLSTATE本地实例化一分拷贝)。一般采用用户定义游标开关和sqlcode返回信息一起共同控制的方法.
- 举例1:(这里说明一个问题,游标开关是和SQLCODE捆绑的。‘02000’就是SQLCODE号)
- //-------
- 标准使用游标的例子
- 标准WHILE DO 控制游标
- //-------
-
- CREATE PROCEDURE CREDITP
- (IN i_perinc DECIMAL(3,2),
- INOUT o_numrec DECIMAL(5,0))
- LANGUAGE SQL
- BEGIN -- 这里是用户管理事务
- DECLARE proc_cusnbr CHAR(5);
- DECLARE proc_cuscrd DECIMAL(11,2);
- DECLARE numrec DECIMAL(5,0);
- DECLARE at_end INT DEFAULT 0; -- 开关定义
- DECLARE not_found CONDITION FOR '02000'; -- 没有数据,游标结尾定义
- DECLARE c1 CURSOR FOR SELECT cusnbr, cuscrd FROM ordapplib.customer;
-
- DECLARE CONTINUE HANDLER FOR not_found SET at_end = 1; --定义CONTINUE 条件
-
- DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK ; --sqlcode 非'01''00''02'则退出并回滚事务
- SET numrec = 0;
-
- OPEN c1;
- FETCH c1 INTO proc_cusnbr, proc_cuscrd;
- WHILE at_end = 0 DO
- SET proc_cuscrd = proc_cuscrd +(proc_cuscrd * i_perinc);
- SET numrec = numrec + 1;
- FETCH c1 INTO proc_cusnbr, proc_cuscrd;
- END WHILE;
- SET o_numrec = numrec;
- CLOSE c1;
- COMMIT; --提交事务
- END
-
- 举例2:
- --声明游标C1
- DECLARE c1 CURSOR FOR
- SELECT cusnbr, cuscrd
- FROM ordapplib.customer;
-
- OPEN c1; --打开游标
- FETCH c1 INTO proc_cusnbr, proc_cuscrd; --从游标获取数据
- IF SQLSTATE = '02000' THEN --判断游标是否有数据(无)
- CALL DATA_NOT_FOUND; --返回调用
- ELSE
- DO WHILE (SUBSTR(SQLSTATE,1,2) = '00' | SUBSTR(SQLSTATE,1,2) = '01');
- FETCH c1 INTO proc_cusnbr, proc_cuscrd;
- ......
-
- END IF ;
- CLOSE c1; --关闭游标
复制代码 |
|