使用动态SQL的MySQL查询失败,错误为“;“命令不同步”;
我有下面的程序来解析一个有很多列的表使用动态SQL的MySQL查询失败,错误为“;“命令不同步”;,mysql,mysql-workbench,dynamic-sql,Mysql,Mysql Workbench,Dynamic Sql,我有下面的程序来解析一个有很多列的表 ## 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
## 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列),并且退出时出现错误“命令不同步”。告诉我,这可能是执行一个查询而没有首先从上一个查询中检索结果的结果
我想知道在您最后注释掉tmpcols中的语句SELECT*from
之后,错误是否仍然存在。(第二个答案)建议具有非空结果集的prepare/execute循环将导致第二个结果集堆叠在第一个结果集之上。告诉我这可能是执行查询而不首先从上一个查询检索结果的结果
我想知道在您最后注释掉tmpcols中的语句
SELECT*from
之后,错误是否仍然存在。(第二个答案)建议具有非空结果集的prepare/execute循环将导致第二个结果集堆叠在第一个结果集之上。@Frank:THX供您回答。我试图取出SELECT,但没有效果。但我意识到INSERT语句似乎运行同步。我替换了“SELECT列”"通过从tbltmpcols中选择*,我可以看到入口的数量比应该的少。同样奇怪的是,在运行此错误后,我无法在workbench中运行任何查询,除非我重新启动它。您是否尝试过在循环中分配和取消分配游标?如果您每次迭代都循环使用游标,它将不会进入错误状态说明光标有未蚀刻的结果集和挂起的查询的位置。你能给我一个简短的示例,这在代码中应该是什么样子吗?@Frank:THX,谢谢你的回答。我试图去掉SELECT,但没有效果。但我意识到INSERT语句似乎运行同步。我替换了“SELECT列”通过从tbltmpcols中选择*,我可以看到入口的数量比应该的少。同样奇怪的是,在运行此错误后,我无法在workbench中运行任何查询,除非我重新启动它。您是否尝试过在循环中分配和取消分配游标?如果您每次迭代都循环使用游标,它将不会进入错误状态说明游标有一个未蚀刻的结果集和一个挂起的查询的位置。您能给我一个简短的示例,这在代码中应该是什么样子的吗?