CALL上存储过程错误

时间:2011-09-27 12:26:27

标签: mysql stored-procedures cursor

我正在尝试调用成功编译的过程,但在调用时我收到此错误:

查询:调用proc5

错误代码:1064 您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“NULL”附近使用正确的语法

这是我的存储过程:

DELIMITER $$

CREATE DEFINER = `root` @`localhost` PROCEDURE `proc5` () 
BEGIN
  DECLARE done BOOL DEFAULT FALSE ;
  DECLARE tablename VARCHAR (100) ;
  DECLARE tracktables CURSOR FOR 
  SELECT 
    TABLE_NAME 
  FROM
    information_schema.TABLES 
  WHERE TABLE_SCHEMA = 'db1' ;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE ;
  OPEN tracktables ;
  myloop :
  LOOP
    FETCH tracktables INTO tablename ;
    IF done 
    THEN CLOSE tracktables ;
    LEAVE myloop ;
    END IF ;
    SET @s = CONCAT(
      'INSERT INTO db2.test1 SELECT * FROM ',
      @tablename
    ) ;
    PREPARE stmt1 FROM @s ;
    EXECUTE stmt1 ;
    DEALLOCATE PREPARE stmt1 ;
  END LOOP ;
END $$

DELIMITER ;

实际上,我想从数据库中选择所有表,并将这些表插入到使用MySQL游标的另一个数据库中的一个表中。当我调用这个存储过程时,我得到了上述错误。

1 个答案:

答案 0 :(得分:3)

问题是你要混合声明的变量和impromtu @vars。

var - > tablename不等于var - > @tablename

将设置行更改为:

SET @s = CONCAT(
  'INSERT INTO db2.test1 SELECT * FROM `'
  ,tablename
  ,'`'
) ;

现在它应该工作了。

不应该需要反引号`,但是以防万一。