FOR,LOOP,WHILE,REPEAT是UDB/400的一种内部循环控制,用于遍历表中符合条件的每一行记录。
例如: 目的:更新employee库,把所有北京籍员工的工资提高10%
例一:使用FOR循环 -------------------------------------------- CREATE PROCEDURE QGPL/TEST_FOR LANGUAGE SQL BEGIN FOR each_record AS cur01 CURSOR FOR SELECT * FROM code,salary,city from employee where city="Beijing" DO UPDATE employee SET salary=salary * 1.1 WHERE CURRENT OF cur01; ENDFOR; END;
例二:使用LOOP循环 ---------------------------------------- CREATE PROCEDURE QGPL/TEST_LOOP LANGUAGE SQL BEGIN DECLARE code_v char(10); DECLARE salary_v integer; DECLARE city_v char(20);
DECLARE C1 CURSOR FOR SELECT code,salary,city FROM employee WHERE city="Beijing"; OPEN C1; loop_label: LOOP FETCH C1 INTO code_v,salary_v,city_v; IF SQLCODE=0 THEN SET salary_v=salary_v*1.1; UPDATE employee SET salary=salary_v WHERE CURRENT OF C1; ELSE LEAVE loop_label; END IF; END LOOP loop_label; CLOSE C1; END;
例三:使用WHILE循环 --------------------------------------- CREATE PROCEDURE QGPL/TEST_WHILE LANGUAGE SQL BEGIN DECLARE code_v char(10); DECLARE salary_v integer; DECLARE city_v char(20); DECLARE at_end integer;
DECLARE C1 CURSOR FOR SELECT code,salary,city FROM employee WHERE city="Beijing"; OPEN C1;
SET at_end=0; WHILE at_end = 0 DO FETCH C1 INTO code_v,salary_v,city_v; IF SQLCODE=0 THEN SET salary_v=salary_v*1.1; UPDATE employee SET salary=salary_v WHERE CURRENT OF C1; ELSE SET at_end=1; END IF; END WHILE; CLOSE C1; END;
例四:使用REPEAT循环 ------------------------------------------------ CREATE PROCEDURE QGPL/TEST_REPEAT LANGUAGE SQL BEGIN DECLARE code_v char(10); DECLARE salary_v integer; DECLARE city_v char(20);
DECLARE C1 CURSOR FOR SELECT code,salary,city FROM employee WHERE city="Beijing"; OPEN C1;
repeat_label: REPEAT FETCH C1 INTO code_v,salary_v,city_v; IF SQLCODE=0 THEN SET salary_v=salary_v*1.1; UPDATE employee SET salary=salary_v WHERE CURRENT OF C1; END IF; UNTIL SQLCODE<>0; END REPEAT repeat_loop; CLOSE C1; END;
总结:四种循环结构实现的功能基本相同,用户可以根据自己的习惯选择使用。 |