我正在尝试调用成功编译的过程,但是在调用时出现此错误:
查询:调用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