存储过程不工作php mysql

时间:2014-12-25 22:53:54

标签: php mysql stored-procedures

我正在尝试编写一个简单的存储过程,用于插入参数作为表名和插入值。

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行的值(?)'

我做错了什么。

2 个答案:

答案 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 演示


原始代码的两个主要问题是:

  1. 在您的情况下,您无法准备没有对象标识符,表名称的语句。对象标识符是静态的。要解决此问题,您应该将表名连接到语句中。

  2. 本地(在您的情况下为IDVALUE)和用户(会话)变量(@IDVALUE)是两个完全不同的野兽。并且EXECUTE ... USING只适用于后者。因此,您需要为会话变量IDVALUE分配值@id

  3. 进一步阅读:

答案 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";