我试图为insert编写一个简单的存储过程,将参数作为表名和insert值。
DELIMITER $$
DROP PROCEDURE IF EXISTS TEST3;
CREATE PROCEDURE TEST3(IN tab_name VARCHAR(40),IN IDVALUE VARCHAR(40))
BEGIN
SET @t2 = CONCAT('INSERT INTO ? (id) VALUES(?)');
PREPARE stmt4 FROM @t2;
EXECUTE stmt4 USING @tab_name, @IDVALUE;
DEALLOCATE PREPARE stmt4;
END $$
DELIMITER ;
它正在创建,但当我调用它时,它会抛出以下错误:
错误1064(42000):您的SQL语法有错误;请查看对应于MySQL服务器版本的手册,以获取在''附近使用的正确语法?(id)值(?)在第1行
我做错了什么。
最佳答案
如果你需要这个你可以这样做
DELIMITER $$
CREATE PROCEDURE TEST3(IN tab_name VARCHAR(40), IN IDVALUE VARCHAR(40))
BEGIN
SET @t2 = CONCAT('INSERT INTO `', tab_name, '` (id) VALUES(?)'),
@id = idvalue;
PREPARE stmt4 FROM @t2;
EXECUTE stmt4 USING @id;
DEALLOCATE PREPARE stmt4;
END$$
DELIMITER ;
这是一个SQLFiddle演示
原始代码的两个主要问题是:
在您的情况下,不能在没有对象标识符、表名的情况下准备语句。对象标识符是静态的。要解决这个问题,应该在语句中连接一个表名。
本地变量(
IDVALUE
在您的例子中)和用户(会话)变量(@IDVALUE
)是两个完全不同的变量。而EXECUTE ... USING
只能用于后者。因此,您需要将IDVALUE
的值赋给会话变量(在我的示例中为@id
)。进一步阅读:
Local Variable DECLARE Syntax
User-Defined Variables
EXECUTE Syntax