对于我的生活,我无法弄清楚为什么我会收到这个错误:
[Err] 1064 - 您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以获得正确的语法 在第1行“NULL”附近使用
我正在调用一个传入了一些变量的简单存储过程。你在这里看不到的是将分隔符设置为//,但这也是完成的。
非常感谢!
SET @dest_database = 'my_db';
SET @table_category_management_pages = 'category_management_pages';
CREATE PROCEDURE category_management_pages(
IN in_name varchar(255),
IN in_display varchar(255),
IN in_notes varchar(255),
IN in_order INT,
IN in_title varchar(255),
IN in_access_name varchar(255)
)
BEGIN
IF NOT EXISTS(
SELECT * FROM information_schema.COLUMNS
WHERE
TABLE_SCHEMA = @dest_database AND
TABLE_NAME = @table_category_management_pages AND
COLUMN_NAME = 'key_hash'
) THEN
# Add UNIQUE index on key_hash
SET @myPrep = CONCAT('ALTER TABLE `', @dest_database, '`.`', @table_category_management_pages, '` ADD COLUMN `key_hash` varchar(255) NULL, ADD UNIQUE INDEX (`key_hash`);');
prepare stmt from @myPrep;
execute stmt;
END IF;
# Update key_hash to latest hash
SET @myPrep = CONCAT('UPDATE `', @dest_database, '`.`', @table_category_management_pages, '`
SET `key_hash` = md5(`name`)');
prepare stmt from @myPrep;
execute stmt;
END//
答案 0 :(得分:0)
我正在回答我自己的问题,因为我发现为什么准备好的陈述不起作用,这是非常简单的愚蠢,但未来可能会影响其他人。在我们公司,我们习惯在声明变量时排列所有等号(参见上面的编辑)。好吧,似乎MySQL不喜欢这种方式的空格,所以全局变量没有正确地在预准备语句中传递。通过将声明更改为:
/* Globals */
SET @dest_database = 'my_db';
SET @table_category_management_pages = 'category_management_pages';
......做得很好。去搞清楚。评论中的这两个建议都很好,但最终还是因为空白。非常令人沮丧,但我希望这有助于将来的某个人。