当前位置: > 数据库 > MySQL >

mysql存储过程+游标循环遍历 判断 赋值 等实例一

时间:2019-02-18 13:00来源:未知 作者:IT
1.先说下本文的背景以及结合什么样的需求作出具体的功能:
最近本人公司半道子不知道老板从哪旮沓里(老板应该不看这类技术型博客,O(∩_∩)O)接手了一个半吊子项目来(接盘侠),先不谈这个项目是咋滴咋滴的。这个项目的注册逻辑是有推荐关系的,分推荐注册和无推荐注册两种,这样的话就会形成一条推荐关系链,但是前期开发项目的人没有在数据库维护好这个推荐关系链,导致到了我们这里这些是没有数据的,因此需要根据每个有推荐人的用户来把他们的推荐关系链修复好,也就是根据用户自己的推荐人获取到推荐人的id,然后再通过推荐人id的推荐人去查找上一级的推荐人,以此类推,最后以推荐人id-推荐人id的形式形成一条推荐关系链,最前面的就是最早注册的哪个人,最末端就是用户自己的推荐人。


2.本人由于也不是经常写存储过程,因此也是网上查找了很多资料,本次需求的逻辑也就是通过游标进行循环遍历,然后判断,赋值等一系列操作,先查找出全部的用户id,然后通过定义游标赋值给游标,然后进行循环(这个循环和iterator很类似),好了 废话结束,上sql,希望这个能帮到看本篇博文的你。
CREATE DEFINER=`admin`@`%` PROCEDURE `updateRecommended`()
BEGIN
DECLARE my_recommended INT;
DECLARE my_id INT;
DECLARE inviteRelationStr VARCHAR(10000);
-- 创建自定义控制游标循环变量
DECLARE done TINYINT DEFAULT FALSE;
-- 创建自定义游标 并输入结果集
DECLARE my_cursor CURSOR FOR (SELECT id FROM hft_user);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

SET inviteRelationStr = '';

-- 打开游标
OPEN my_cursor;
-- 循环开始
my_loop: LOOP
  FETCH NEXT FROM my_cursor INTO my_id;


   IF done THEN
    LEAVE my_loop;
   END IF;
   -- 开始操作
   SELECT recommended INTO my_recommended FROM hft_user WHERE id = my_id;
  

   WHILE my_recommended IS NOT NULL OR my_recommended != '' DO
    SET inviteRelationStr = CONCAT(my_recommended,'-',inviteRelationStr);
    SELECT recommended INTO my_recommended FROM hft_user WHERE id = my_recommended;
   END WHILE;

   -- 修改推荐连
   UPDATE hft_user SET invite_relation = inviteRelationStr WHERE id = my_id;
  
   SET inviteRelationStr = '';
   -- 提交事务
   COMMIT;
  
END LOOP my_loop;

CLOSE my_cursor; -- 关闭游标
END

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容