MySQL 程序在恰好 50 次循环 wir 错误后停止 "Error Code: 2014 Commands out of sync; you can't run this command now"

MySQL procedure stops after exactly 50 loops wir error "Error Code: 2014 Commands out of sync; you can't run this command now"

如果有以下过程,它在 50 个循环后恰好停止并出现错误 "Error Code: 2014 Commands out of sync; you can't run this command now"。我玩了一下,似乎没有超时问题。有什么想法吗?

## Prozedur Droppen
DROP PROCEDURE IF EXISTS ifob.uspCreateViewFromTable;

## Prozedur erstellen
DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `uspCreateViewFromTable`(IN ViewName varchar(255), IN TableName varchar(255))
BEGIN

  -- DECLARE column varchar(500);
  DECLARE colname varchar(500);
  DECLARE done BOOL DEFAULT FALSE;

  DECLARE column_cursor CURSOR FOR
  SELECT column_name
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = Tablename;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  #View Droppen falls sie schon erstellt wurde
  SET @s = CONCAT('DROP VIEW IF EXISTS ',ViewName);
  PREPARE stmt FROM @s;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
  #Init
  SET @used = 'Used:';
  SET @unused = 'Unused:';
  #Loop through columns
  OPEN column_cursor;
  read_loop: LOOP
      FETCH column_cursor INTO colname;
      SET @c=CONCAT('SELECT COUNT(`',colname, '`) INTO @outvar FROM (SELECT `',colname,'` FROM ',TableName,' WHERE `',colname,'` != 0 OR `',colname,'` != null  ORDER BY `Time` DESC LIMIT 0,10) AS temp');

      PREPARE stmt FROM @c;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;

      IF @outvar>0 THEN
        SET @used = CONCAT(@used,';',colname);
      ELSE
        SET @unused = CONCAT(@unused, ';', colname);
      END IF;
      #debug
      SELECT @used UNION SELECT @unused; 

      IF done THEN
        LEAVE read_loop;
      END IF;
  END LOOP;
  CLOSE column_cursor;

END$$
DELIMITER ;

据我所知,MySQL 存储过程中的循环似乎存在问题,将输出的选择数量限制为 50。尝试删除

SELECT @used UNION SELECT @unused; 

然后看看你的程序是否能够运行。 Select ... into好像没有这个问题,所以你想执行多少就执行多少。

我遇到了同样的问题。当我提取代码并 运行 它在 Workbench 它看起来像是在为每个循环调用存储过程。

CREATE PROCEDURE TestLoop()
BEGIN
DECLARE done int DEFAULT FALSE;
DECLARE DetId integer;
DECLARE DetSeq tinyint;
DECLARE ItemId smallint;
DECLARE Cnt smallint DEFAULT 0;
DECLARE Total smallint DEFAULT 0;

DECLARE SaleItem CURSOR FOR SELECT SalDetSalId, SalDetSeq, SalDetInvId FROM SaleDetail WHERE SalDetCost = 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

SELECT COUNT(*) FROM SaleDetail WHERE SalDetCost = 0 INTO Total;

OPEN SaleItem;

read_loop: LOOP
    FETCH SaleItem INTO DetId, DetSeq, ItemId;
    IF done THEN LEAVE read_loop; END IF;
    SET Cnt=Cnt+1;
    SELECT DetId, DetSeq, ItemId, Cnt, Total;
END LOOP read_loop;

CLOSE SaleItem;
SELECT Cnt, Total;
END; //

这似乎是 MySQL workbench 早期版本的问题。升级到 MySQL Workbench 6.3.7 版本

已提交错误 https://bugs.mysql.com/bug.php?id=77470

”已在即将发布的 MySQL Workbench 6.3.7 版本中修复,这里是变更日志条目: Workbench现在会提示继续执行操作 在存储过程中包含循环,而不是在之后取消循环 ~200 次处决。

感谢您的错误报告。"