场景
需要查询出一个结果集,并遍历它。此时需要用到游标(类似其他编程语言中的迭代器)。
本示例中,有两张表,user_table
和job_table
user_table
中有一个字段jobs用来保存用户的职业信息,而job_table
是一张字典表。
如user_table
中保存"1,2,3"则代表了job_table
中id为1、2、3的职业
现在需要对user_table
进行遍历,将"1,2,3"更新为实际的值"作家,个体经营,律师"这样子
使用方法
先看完整的存储过程:
DROP PROCEDURE IF EXISTS transfer_job;
CREATE PROCEDURE `transfer_job` () BEGIN
DECLARE userId INTEGER;
DECLARE jobs VARCHAR ( 255 );
DECLARE s INT DEFAULT 0;
DECLARE users CURSOR FOR SELECT id userId FROM user_table;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = 1;
OPEN users;
FETCH users INTO userId;
WHILE s <> 1 DO
SET @userId = userId;
SELECT GROUP_CONCAT( `value` ) INTO @jobs FROM job_table
WHERE FIND_IN_SET(`key`,(SELECT jobs FROM user_table WHERE id = @userId));
UPDATE user_table SET jobs = @jobs WHERE id = @userId;
FETCH users INTO userId;
END WHILE;
CLOSE users;
END
-
声明需要用到的变量
DECLARE userId INTEGER; DECLARE jobs INTEGER;
-
声明遍历标志位
DECLARE s INT DEFAULT 0;
-
声明游标
DECLARE users CURSOR FOR SELECT id userId FROM user_table;
-
为标志位设置遍历结束时的取值
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = 1;
-
正式遍历
# 先打开游标 OPEN users; # 将游标中的值复制给变量 FETCH users INTO userId; # 根据标志位判断是否结束 WHILE s <> 1 DO # 把上面的变量拿出来赋值给上面声明的变量 SET @userId = userId; # 执行遍历逻辑 # 再取出一个值,本次while代码段结束,将取出的值进入下一次循环判断 FETCH users INTO userId; # 直到s = 1时彻底结束while循环 END WHILE; # 关闭游标 CLOSE users;