Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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游标_Mysql_Sql_Database_Cursor - Fatal编程技术网

仅获取一行的MySQL游标

仅获取一行的MySQL游标,mysql,sql,database,cursor,Mysql,Sql,Database,Cursor,我的SQL: 当我调用这个过程时,MySQL只获取一行(_debugrows增加1)。为什么?这是一个bug吗?您是否尝试过循环而不是重复构造?在MySQL中似乎工作得更好。将重复到端重复部分替换为: CREATE PROCEDURE INV_MIN_PURCHASE_PRICE() BEGIN DECLARE done INT; DECLARE current_inventory_ID INT; DECLARE cur1 CURSOR FOR SELECT inventory_ID FROM

我的SQL:


当我调用这个过程时,MySQL只获取一行(_debug
rows
增加1)。为什么?这是一个bug吗?

您是否尝试过循环而不是重复构造?在MySQL中似乎工作得更好。将重复到端重复部分替换为:

CREATE PROCEDURE INV_MIN_PURCHASE_PRICE()
BEGIN
DECLARE done INT;
DECLARE current_inventory_ID INT;
DECLARE cur1 CURSOR FOR SELECT inventory_ID FROM _inventory;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

SET done = 0;
OPEN cur1;

REPEAT

    FETCH cur1 INTO current_inventory_ID;
    UPDATE _debug SET rows=rows+1;

UNTIL done
END REPEAT;

CLOSE cur1;

END;

我只是在MySQL中的存储过程中遇到了同样的问题。它应该从某一列中具有空值的表中获取所有记录,然后从另一个表中填充该值。但是,它在一个记录之后停止:

inv_loop: LOOP
    FETCH cur1 INTO current_inventory_ID;
    IF done = 1 THEN
        LEAVE inv_loop;
    END IF;
    UPDATE _debug SET rows=rows+1;
END LOOP;
答案是,“未找到的处理程序”不仅在光标未返回任何行时执行,而且在表B上的select未返回任何行时也会执行。我的解决方案是使用处理程序设置的第二个变量,并在选择后重置“done”变量:

CREATE PROCEDURE `updateRecord`()
    BEGIN

    DECLARE done INT DEFAULT FALSE;
    DECLARE recordId, newValue INT;
    DECLARE current_record CURSOR FOR SELECT id FROM A where b_id is null;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN current_record;

    main_loop: LOOP
        FETCH current_record INTO recordId;

        IF done THEN
             LEAVE main_loop;
        END IF;

        -- fetching some value from table b
        select id into newValue from B where ...

       -- setting new value in record
       update A set b_id = newValue where id = recordId;    

      END LOOP;
    END
添加:显然,不需要第二个变量,只需在选择后重置“完成”即可:

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE, noBfound = TRUE;    

           [...]

           select id into newValue from B where ...

           IF (noBfound = TRUE) THEN 
               SET done = FALSE;
           END IF;

           [...]

我首先尝试了这个(基于MySQL文档中的示例)。没有成功。我假设如果您在MySQL控制台中尝试从库存中选择库存id,您会返回多行,对吗?当然。我已经解决了这个问题。将我的MySQL服务器更新为最新版本,现在代码工作正常。问得好。。那么解决方案是什么呢?这是正确的方法:添加:显然,不需要第二个变量,只需在选择后重置“完成”即可。简洁
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

           [...]

           select id into newValue from B where ...

           SET done = FALSE;

           [...]
IF done THEN
         LEAVE main_loop;
ELSE
         ITERATE main_loop;
END IF;