2014-06-22 142 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 ;