MySQL 遊標與嵌套循環

遊標嵌套遍歷


user表:
在這裏插入圖片描述

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
BEGIN
    DECLARE user1 VARCHAR(100);
    DECLARE user2 VARCHAR(100);
    DECLARE done INT DEFAULT 0;
    DECLARE cursor_user1 CURSOR FOR(SELECT `name` FROM `user`); -- 定於遊標1
    DECLARE cursor_user2 CURSOR FOR(SELECT `name` FROM `user`); -- 定義遊標2
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 結束標識
    
    OPEN cursor_user1; -- 開啓遊標1
    loop_1: LOOP -- 外層循環
    -- -------------------------------------------------------------------------------------
			# 嘗試從遊標1指向的數據集合獲取數據,如果集合已經遍歷完畢,done的值被設置爲1。
			FETCH cursor_user1 INTO user1;
			IF done = 1 THEN LEAVE loop_1; END IF; -- 外層循環結束條件
			
			OPEN cursor_user2; -- 開啓遊標2
			loop_2: LOOP -- 內層循環
			-- -----------------------------------------------------------------------------
					# 嘗試從遊標2指向的數據集合獲取數據,如果集合已經遍歷完畢,done的值被設置爲1。
					FETCH cursor_user2 INTO user2;
					IF done = 1 THEN LEAVE loop_2; END IF; -- 內層循環結束條件
					
					# do something...
					
		    -- -----------------------------------------------------------------------------
			END LOOP loop_2;
			CLOSE cursor_user2; -- 關閉遊標2
			
			SET done = 0; -- important
    -- ------------------------------------------------------------------------------------
    END LOOP loop_1;
    CLOSE cursor_user1; -- 關閉遊標1
END

測試

user表數據:
在這裏插入圖片描述

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
BEGIN
    DECLARE result VARCHAR(2000) DEFAULT 'result';
    DECLARE user1 VARCHAR(100);
    DECLARE user2 VARCHAR(100);
    DECLARE done INT DEFAULT 0;
    DECLARE cursor_user1 CURSOR FOR(SELECT `name` FROM `user`); -- 定於遊標1
    DECLARE cursor_user2 CURSOR FOR(SELECT `name` FROM `user`); -- 定義遊標2
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 結束標識
    
    OPEN cursor_user1; -- 開啓遊標1
    loop_1: LOOP -- 外層循環
    -- -------------------------------------------------------------------------------------
			# 嘗試從遊標1指向的數據集合獲取數據,如果集合已經遍歷完畢,done的值被設置爲1。
			FETCH cursor_user1 INTO user1;
			IF done = 1 THEN LEAVE loop_1; END IF; -- 外層循環結束條件
			
			OPEN cursor_user2; -- 開啓遊標2
			loop_2: LOOP -- 內層循環
			-- -----------------------------------------------------------------------------
					# 嘗試從遊標2指向的數據集合獲取數據,如果集合已經遍歷完畢,done的值被設置爲1。
					FETCH cursor_user2 INTO user2;
					IF done = 1 THEN LEAVE loop_2; END IF; -- 內層循環結束條件
					
					# do something...
					SET result = CONCAT(result,';',user1,'-',user2);
					
		    -- -----------------------------------------------------------------------------
			END LOOP loop_2;
			CLOSE cursor_user2; -- 關閉遊標2
			
			SET done = 0; -- important
    -- ------------------------------------------------------------------------------------
    END LOOP loop_1;
    CLOSE cursor_user1; -- 關閉遊標1
	SELECT result; 
END

執行結果:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章