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 次处决。
感谢您的错误报告。"
如果有以下过程,它在 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 次处决。
感谢您的错误报告。"