请问各位大侠mysql游标如何多重循环呢?我的代码如下:
DROP PROCEDURE IF EXISTS `GetUserList`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `GetUserList`(IN sampleId varchar(32))
BEGIN
    /* get user list*/
     DECLARE groupId varchar(32);
     DECLARE logingUser varchar(60);
     DECLARE userName varchar(60);
     DECLARE userGroup varchar(32);
     DECLARE is_group_found integer DEFAULT 1;
     DECLARE is_user_found integer DEFAULT 1;
     /*declare usergroup cursor*/
     DECLARE cus_group CURSOR FOR SELECT user_group_id FROM tbl_user_group_v010
                                  WHERE user_group_id IN (SELECT user_group_id FROM tbl_group_sample_v010
                                                          WHERE sample_id = sampleId);
     DECLARE cus_user CURSOR FOR SELECT user_name,user_group_id FROM tbl_user_v010;
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_group_found = 0;
     DELETE FROM tbl_tempuser_v010;
     OPEN cus_group;
     FETCH cus_group INTO groupId;
     WHILE is_group_found = 1 DO
         BEGIN
             DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_user_found = 0;
             OPEN cus_user;
             FETCH cus_user INTO userName,userGroup;
             WHILE is_user_found = 1 DO
                 IF groupId = userGroup THEN /*find user*/
                    INSERT INTO tbl_tempuser_v010 SELECT * FROM tbl_user_v010 WHERE user_name IN(  SELECT loging_user FROM tbl_session_v010 WHERE loging_user = userName AND client_stat = 1);
                 END IF;
              FETCH cus_user INTO userName,userGroup;
              END WHILE;
              CLOSE cus_user;
         END;
        FETCH cus_group INTO groupId;
     END WHILE;
     CLOSE cus_group;
     COMMIT;
END;内层游标只循环一次,不知道为什么,请各位帮忙看下啊。

解决方案 »

  1.   

    SET is_group_found=1
    FETCH cus_group INTO groupId;
      

  2.   

    DELIMITER ;;
    CREATE DEFINER=`root`@`%` PROCEDURE `GetUserList`(IN sampleId varchar(32))
    BEGIN
       /* get user list*/
        DECLARE groupId varchar(32);
        DECLARE logingUser varchar(60);
        DECLARE userName varchar(60);
        DECLARE userGroup varchar(32);
        DECLARE is_group_found integer DEFAULT 1;
        DECLARE is_user_found integer DEFAULT 1;
        /*declare usergroup cursor*/
        DECLARE cus_group CURSOR FOR SELECT user_group_id FROM tbl_user_group_v010
                                     WHERE user_group_id IN (SELECT user_group_id FROM tbl_group_sample_v010
                                                             WHERE sample_id = sampleId);
        DECLARE cus_user CURSOR FOR SELECT user_name,user_group_id FROM tbl_user_v010;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_group_found = 0;
        DELETE FROM tbl_tempuser_v010;
        OPEN cus_group;
        FETCH cus_group INTO groupId;
        WHILE is_group_found = 1 DO
            BEGIN
                DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_user_found = 0;
                OPEN cus_user;
                FETCH cus_user INTO userName,userGroup;
                WHILE is_user_found = 1 DO
                    IF groupId = userGroup THEN /*find user*/
                       INSERT INTO tbl_tempuser_v010 SELECT * FROM tbl_user_v010 WHERE user_name IN(  SELECT loging_user FROM tbl_session_v010 WHERE loging_user = userName AND client_stat = 1);
                    END IF;
                 FETCH cus_user INTO userName,userGroup;
                 END WHILE;
                 CLOSE cus_user;
            END;
           SET is_group_found = 1;
           FETCH cus_group INTO groupId;
        END WHILE;
        CLOSE cus_group;
        COMMIT;
    END;
      

  3.   

    谢谢各位,现在在 IF 判断里又只执行了一次,我把set is_user_found = 1 加到了 SET is_group_found = 1;
    的前面,我这样写可以吗?