数据库
首页 > 数据库> > mysql-CALL上的存储过程错误

mysql-CALL上的存储过程错误

作者:互联网

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

查询:调用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游标将这些表插入到另一个数据库中的一个表中.当我调用此存储过程时,出现上述错误.

解决方法:

问题是您正在混合声明的变量和即兴@vars.

var->表名不等于var-> @tablename.

将设置行更改为:

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

现在应该可以了.

反引号`不需要,但以防万一.

标签:cursor,mysql,stored-procedures
来源: https://codeday.me/bug/20191207/2087277.html