带有动态 SQL 的 MySQL 查询死于错误 "Commands out of sync"

标签 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

  -- 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/

相关文章:

c# - 对象引用,无法找到用户 ID

mysql 查询获取年龄 25/04 月格式,其中日期格式为 1988-04-04?

mysql - 如何从表中删除第二高的工资

php - MySQL Partitioning Join Table(双PK)

mysql - 如何将结果网格放置在右上角,即mysql工作台中sql添加的位置?

sql - 从动态 sql 中选择非空列作为逗号分隔的字符串

java - 在 MySQL 数据库中搜索半径内的值(纬度/经度)

mysql - 从两列中选择值并将它们连接到不同表上的列中

oracle - ORA-01007 "variable not in select list"来自 dbms_sql.column_value 调用

c# - 如何从数字生成最短的数据库标识符名称?