从存储过程插入Mysql会产生错误1064

时间:2014-06-22 20:37:25

标签: mysql stored-procedures

由于某些奇怪的原因,从存储过程插入不起作用。 这就是我想要做的事情:

DROP TABLE IF EXISTS test;
CREATE TABLE IF NOT EXISTS  test(
id                                          INT(9)                  NOT NULL AUTO_INCREMENT
,name                                       VARCHAR(30)     NOT NULL 
,PRIMARY KEY (id)

)DEFAULT CHARSET = utf8;     插入测试(名称)值('A');

从命令行插入可以正常工作。

然后我创建了一个存储过程来执行相同类型的插入:

DROP PROCEDURE IF EXISTS storedtest;
DELIMITER $$
CREATE PROCEDURE storedtest()
    BEGIN
        declare insert_sql varchar(200);
        SET insert_sql = 'insert into test (name) values(3)';
        SELECT insert_sql;
        PREPARE mystm FROM @insert_sql;
        EXECUTE mystm;
   END$$
DELIMITER ;

call storedtest();

这给了我错误: 错误1064(42000):您的SQL语法有错误;检查与MariaDB服务器版本对应的手册,以便在第1行的“NULL”附近使用正确的语法

NULL? NULL来自哪里?

我也尝试过更改sql-insert看起来像这样(不知道这是不是很好):

    SET insert_sql = "insert into test (name) values('3')";

但是mysql给了我完全相同的错误。 任何人都有线索?

1 个答案:

答案 0 :(得分:1)

NULL MySQL报告的是一个空的用户变量@insert_sql,它与您使用insert_sql分配的本地存储过程局部变量DECLARE不同。

MySQL的DECLARE用于存储程序的本地变量,but according to the documentationPREPARE stmt FROM ...需要字符串文字或用户变量,它们是类型以@开头。

  

PREPARE stmt_name FROM preparable_stmt

     

preparable_stmt 是字符串文字或包含SQL语句文本的用户变量。

您可以使用SET分配无类型的用户变量,因此不需要DECLARE。完成后,您可能希望将其设置为NULL

DROP PROCEDURE IF EXISTS storedtest;
DELIMITER $$
CREATE PROCEDURE storedtest()
BEGIN
  -- Just SET the user variable
  SET @insert_sql = 'insert into test (name) VALUES (3)';
  SELECT @insert_sql;

  -- Prepare & execute
  PREPARE mystm FROM @insert_sql;
  EXECUTE mystm;

  -- Deallocate the statement and set the var to NULL
  DEALLOCATE PREPARE mystm;
  SET @insert_sql = NULL;
END$$
DELIMITER ;