DB2循环游标,如何使循环能够继续

cf7852 2007-12-14 02:08:03
CREATE PROCEDURE bump_salary_iftest (IN deptnumber SMALLINT)
LANGUAGE SQL
BEGIN
DECLARE SQLSTATE CHAR(5);
DECLARE v_salary DOUBLE;
DECLARE v_years SMALLINT;
DECLARE v_id SMALLINT;
DECLARE at_end INT DEFAULT 0;
DECLARE not_found CONDITION FOR SQLSTATE '02000';

DECLARE C1 CURSOR FOR
SELECT id, CAST(salary AS DOUBLE), years
FROM staff;
DECLARE CONTINUE HANDLER FOR not_found
SET at_end = 1;

OPEN C1;
FETCH C1 INTO v_id, v_salary, v_years;
WHILE at_end = 0 DO

UPDATE staff
SET salary = 2150 * v_years
WHERE id = -1;


FETCH C1 INTO v_id, v_salary, v_years;
END WHILE;
CLOSE C1;
END

请问,我想让这个循环执行完,但是由于SET salary = 2150 * v_years
WHERE id = -1 更新的数据为0条,at_end变量就被置为1,从而导程序跳出循环,我如何做,能够及时更新数据为0行
,而循环还能继续下去呢,请高手指点
...全文
1090 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
littleboys 2007-12-14
  • 打赏
  • 举报
回复
可以先计算循环次数,根据这个数值进行循环
结果:
D:\>db2 call bump_salary_iftest(10,?)

输出参数的值
--------------------------
参数名: IRETURN
参数值: 35

返回状态 = 0


CREATE PROCEDURE bump_salary_iftest(IN deptnumber SMALLINT,out iReturn int)
LANGUAGE SQL
BEGIN
DECLARE SQLSTATE CHAR(5);
DECLARE v_salary DOUBLE;
DECLARE v_years SMALLINT;
DECLARE v_id SMALLINT;
DECLARE at_end INT DEFAULT 0;
DECLARE not_found CONDITION FOR SQLSTATE '02000';

Declare v_temp int;

DECLARE C1 CURSOR FOR
SELECT id, CAST(salary AS DOUBLE), years
FROM staff;
DECLARE CONTINUE HANDLER FOR not_found
SET at_end = 1;

-- get the loop number
select count(*) into v_temp from staff;
set iReturn =0;
OPEN C1;
FETCH C1 INTO v_id, v_salary, v_years;
WHILE v_temp>0 DO
-- out the iReturn to check the result
set iReturn =iReturn+1;
UPDATE staff
SET salary = 2150 * v_years
WHERE id = -1;
FETCH C1 INTO v_id, v_salary, v_years;
set v_temp = v_temp-1;
END WHILE;
CLOSE C1;
END@

5,889

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧