Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 而存储过程中的循环只循环两次,而不是8次_Mysql_Sql - Fatal编程技术网

Mysql 而存储过程中的循环只循环两次,而不是8次

Mysql 而存储过程中的循环只循环两次,而不是8次,mysql,sql,Mysql,Sql,表格checkval val ---- 5705 5704 5703 5702 5701 存储过程 BEGIN DECLARE x INT; DECLARE done INT DEFAULT FALSE; DECLARE myType INT; DECLARE cur1 CURSOR FOR select val from checkval; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

表格checkval

val
----
5705
5704
5703
5702
5701
存储过程

BEGIN
    DECLARE x INT;
DECLARE done INT DEFAULT FALSE;
    DECLARE myType INT;
    DECLARE cur1 CURSOR FOR select val from checkval;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    SET x = 10;

    WHILE x  >= 2 DO
##############

    OPEN cur1;

    read_loop: LOOP
        IF done THEN
            LEAVE read_loop;
        END IF;

        FETCH cur1 INTO myType;
        insert into myType values (myType);


    END LOOP read_loop;                              
CLOSE cur1;
        SET  x = x-1; 

    ##################
    END WHILE;

END
电流输出

5705
5704
5703
5702
5701--Loops only twice
5705
5704
5703
5702
5701
5705 - Loops 8 times
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701
所需输出

5705
5704
5703
5702
5701--Loops only twice
5705
5704
5703
5702
5701
5705 - Loops 8 times
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701
5705
5704
5703
5702
5701

为什么即使我指定了从
10
开始到
2
结束的while循环,我的输出在目标表中也只循环了两次。我希望看到它重复8次。你能帮忙吗?

我想这和你的经纪人有关。尝试添加
SET done=FALSE
关闭光标后

==编辑==

一般来说,你应该避免像瘟疫一样的游标

你可以用一个

看这个


您可以将值添加到数字表中,以便根据需要任意复制数据。

这很有效,但方式很有趣。现在我得到了所有东西18次:)还有什么我应该删除或移动的吗?@jmenezes请查看我的编辑,以获得一种完全不使用光标的方法。这也只做了一次:(我可以看到你添加了
DECLARE done INT DEFAULT FALSE;
OK。我添加了
N WEST
建议的内容,现在它可以正常工作了。你说什么?我说的是,我不知道如何在光标关闭后重复使用光标。我还想说,我避免像瘟疫一样的光标,因为它们的表现像dog doo doo,通常它会提示一些事情。)这就是为什么我不会把使用游标作为最后的手段。做你想做的事情,可能总有一种比使用游标快100倍的方法。游标的问题在于:它们无法扩展。有时,当出现棘手的情况时,你似乎只能使用它。但你使用它们的次数越多,你就越认为这是所有工作的方式一旦你开始嵌套游标,性能就会变得指数级的痛苦
DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `fred`$$

CREATE DEFINER=`root`@`windows7.home` PROCEDURE `fred`()
BEGIN
    DECLARE X INT;
DECLARE done INT DEFAULT FALSE;
    DECLARE myType INT;
    DECLARE cur1 CURSOR FOR SELECT val FROM checkval;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    SET X = 10;
    WHILE X  >= 2 DO
##############
    OPEN cur1;
    FETCH cur1 INTO myType;
    read_loop: LOOP
        IF done THEN
            LEAVE read_loop;
        END IF;
        INSERT INTO myType VALUES (myType);
        FETCH cur1 INTO myType;
    END LOOP read_loop;                              
CLOSE cur1;
        SET  X = X-1;
        SET done=FALSE;
    ##################
    END WHILE;
    END$$

DELIMITER ;