mysql存储过程游标 + while

开始

1、建立一张学生表

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(256) DEFAULT NULL,
  `class` varchar(256) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '张三', '1班');
INSERT INTO `student` VALUES ('2', '李四', '2班');
INSERT INTO `student` VALUES ('3', '王五', '3班');
INSERT INTO `student` VALUES ('4', '麻子', '1班');
INSERT INTO `student` VALUES ('5', '老王', '3班');

2、建立存储过程 

DROP  PROCEDURE  IF EXISTS whileFor;
DELIMITER $$ 
CREATE PROCEDURE whileFor(OUT namess VARCHAR(1024))
BEGIN
    DECLARE a VARCHAR(500);
    DECLARE i , j , Done INT DEFAULT 0 ;
    -- 申明游标
    DECLARE rs CURSOR FOR SELECT NAME FROM student;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1 ;
    SET namess = '' , i = 0 , j = 1;
    -- 循环四次
    WHILE (j < 5) DO
	-- 如果不是第一次,我们这里加一个|区分
	IF(j > 1) THEN 
	   SELECT CONCAT(namess,'|') INTO namess; 
	END IF;
	
	-- 打开游标
        OPEN rs;
            FETCH NEXT FROM rs INTO a;
            REPEAT
                SET i = i + 1 ; 
                IF(i != 1 ) THEN
                    SELECT CONCAT(namess,',' , a) INTO namess;
                ELSE
                    SELECT CONCAT(namess , a) INTO namess;
                END IF;
                 
            FETCH NEXT FROM rs INTO a;
        UNTIL Done END REPEAT;
        CLOSE rs;
        SET j = j + 1;
        SET Done = 0 ; 
        SET i = 0 ;
    END WHILE;
END

3、调用存储过程

CALL whileFor(@names);

SELECT @names;

  执行结果为:

张三,李四,王五,麻子,老王|张三,李四,王五,麻子,老王|张三,李四,王五,麻子,老王|张三,李四,王五,麻子,老王

结束

猜你喜欢

转载自blog.csdn.net/liguoqingxjxcc/article/details/81531267