我正在尝试编写一个简单的存储过程,用于插入参数作为表名和插入值。
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行的值(?)'
我做错了什么。
答案 0 :(得分:3)
如果你需要这个,你可以这样做
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
。
进一步阅读:
答案 1 :(得分:0)
Try running this query, it worked for me in phpmyadmin
CREATE PROCEDURE `sample_procedure`(IN `10` INT) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER SELECT "print this";