【问题标题】:MySQL Stored Procedure, define CURSOR FOR with variableMySQL存储过程,用变量定义CURSOR FOR
【发布时间】:2016-05-04 21:31:55
【问题描述】:

我正在 MySQL 中创建一个存储过程来循环一组值并对每个值执行相同的 INSERT/UPDATE 操作。

INSERT/UPDATE 操作保持不变,但在我编写的整个脚本中需要循环的值会发生变化。下面是我正在尝试做的一个简化示例:

DELIMITER $$
CREATE PROCEDURE `log_feed_times`()
BEGIN
    DECLARE `no_more_rows` BOOLEAN;
    DECLARE `current_animal` INT DEFAULT 0;
    DECLARE `animal` CURSOR FOR @query;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;
    OPEN `animal`;
    chores: LOOP
    FETCH `animal` INTO `current_animal`;
    IF no_more_rows = TRUE THEN
        LEAVE move_now;
    END IF;

    UPDATE farm_animal SET last_feed_time = now() WHERE id = `animal`;

    END LOOP chores;
    CLOSE `animal`;
END$$
DELIMITER ;

SET @query = "SELECT id FROM farm_animal WHERE name IN ('horse', cow')";

CALL `log_feed_times`;

SET @query = "SELECT id FROM farm_animal WHERE name IN ('pig', 'duck')";

CALL `log_feed_times`;

到目前为止,我这样做的尝试导致了 ERROR 1064 (42000)。

【问题讨论】:

    标签: mysql loops stored-procedures cursor


    【解决方案1】:
    1. 您应该在更新查询中使用 current_animal 而不是 animal
     UPDATE farm_animal SET last_feed_time = now() WHERE id = current_animal;
    
    1. 要离开的循环应该是chores
     IF no_more_rows = TRUE THEN
            LEAVE chores;
        END IF;
    

    【讨论】:

      猜你喜欢
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      相关资源
      最近更新 更多