由于某些奇怪的原因,从存储过程插入不起作用。 这就是我想要做的事情:
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给了我完全相同的错误。 任何人都有线索?
答案 0 :(得分:1)
NULL
MySQL报告的是一个空的用户变量@insert_sql
,它与您使用insert_sql
分配的本地存储过程局部变量DECLARE
不同。
MySQL的DECLARE
用于存储程序的本地变量,but according to the documentation,PREPARE 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 ;