我有以下程序来解析具有相当多列的表。
## 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 FOR SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = Tablename;
*/
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;
#temp table droppen falls schon vorhanden
DROP TABLE IF EXISTS ifob.tmpcols;
# temporäre Tabelle erstellen
CREATE TEMPORARY TABLE ifob.tmpcols(columnname varchar(1024), averg real) ENGINE=MEMORY;
-- OPEN column_cursor
OPEN column_cursor;
read_loop: LOOP
FETCH column_cursor INTO colname;
SELECT colname;
SET @c=CONCAT('INSERT ifob.tmpcols SELECT `',colname,'`, AVG(`',colname, '`) FROM ',TableName,' LIMIT 0,100');
PREPARE stmt FROM @c;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
IF done THEN
LEAVE read_loop;
END IF;
END LOOP;
CLOSE column_cursor;
#SELECT * from tmpcols;
#DROP TABLE IF EXISTS ifob.tmpcols;
END$$
DELIMITER ;
当我调用该过程时,它运行良好大约 1 1/2 分钟(大约 40 列),然后它退出并出现错误“命令不同步”。
最佳答案
MySQL documentation告诉我这可能是在没有先检索上一个查询的结果的情况下执行查询的结果。
我想知道你在最后注释掉语句SELECT * from tmpcols
后是否仍然存在错误。 This SO question (第二个答案)表明具有非空结果集的准备/执行循环将导致第二个结果集堆叠在第一个结果集之上。
关于带有动态 SQL 的 MySQL 查询死于错误 "Commands out of sync",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33774486/