游標嵌套遍歷
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
執行結果: