mysql游标的使用:对查询的结果进行遍历
游标
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。 游标充当指针的作用。 尽管游标能遍历结果中的所有行,但他一次只指向一行。 游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。
-- 生成所有父id; -- 分隔标记 delimiter $$ -- 创建存储过程 create procedure testCur() BEGIN -- 声明变量 DECLARE cid BIGINT; DECLARE done INT; -- 创建游标,并设置游标所指的数据(这里设置ID不为1是因为ID为1的是总的大类) DECLARE cur CURSOR for SELECT id as cid from mdm_material_category where parent_id!='1' and id!='1'; -- 游标执行完,即遍历结束。设置done的值为1 DECLARE CONTINUE HANDLER for not FOUND set done=1; -- 开启游标 open cur; -- 执行循环 posLoop:LOOP -- 如果done的值为1,即遍历结束,结束循环 IF done=1 THEN LEAVE posLoop; -- 注意,if语句需要添加END IF结束IF END IF; -- 从游标中取出cid FETCH cur INTO cid; -- 以游标中取出的cid为索引,逐行更新分类表:某分类parent_ids值为它的父分类parent_ids值和它父类的id UPDATE mdm_material_category m1,mdm_material_category m2 SET m1.parent_ids=CONCAT(m2.parent_ids,',',m2.id) where m1.parent_id=m2.id and m1.id=cid; -- 关闭循环 END LOOP posLoop; -- 关闭游标 CLOSE cur; -- 关闭分隔标记 END $$
对于上述代码有几个需要注意的地方:
1.mysql存储过程每一句后面必须用;结尾,使用的临时字段需要在定义游标之前进行声明。
2. 在mysql中对于变量的声明(Declare)只能在存储过程中。注意分隔标记的缺少可能会导致失败。
接下来就是执行存储过程:
CALL testCur;
删除存储过程:
DROP PROCEDURE testCur;
关于游标的使用就是如上了!