2014-06-22 108 views
1

由于某种奇怪的原因,从存储过程插入不起作用。 这是林试图做:从存储过程插入Mysql会导致错误1064

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) 

)默认字符集= 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(); 

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

NULL? NULL来自哪里?

我也试图改变的SQL插入看起来像这样(不知道这是否是一个很好的方式):

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

但MySQL的给我一模一样的错误。 任何人都有线索?

回答

1

NULL MySQL是报告是一个空的用户变量@insert_sql,这是从你DECLARE分配的本地存储过程中的局部变量insert_sql不同。

MySQL的DECLARE用于局部变量的存储程序,but according to the documentationPREPARE stmt FROM ...预计是一个字符串文字或用户变量,其前面有@类型。

PREPARE stmt_name FROM preparable_stmt

preparable_stmt is either a string literal or a user variable that contains the text of the SQL statement.

您可以分配与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 ;