我正在尝试调用成功编译的过程,但在调用时我收到此错误:
查询:调用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游标的另一个数据库中的一个表中。当我调用这个存储过程时,我得到了上述错误。
答案 0 :(得分:3)
问题是你要混合声明的变量和impromtu @vars。
var - > tablename
不等于var - > @tablename
。
将设置行更改为:
SET @s = CONCAT(
'INSERT INTO db2.test1 SELECT * FROM `'
,tablename
,'`'
) ;
现在它应该工作了。
不应该需要反引号`
,但是以防万一。