mysql存儲過程+遊標循環遍歷 判斷 賦值 等實例一

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

純手打,如有雷同,肯定是抄襲~~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章