【问题标题】:MySQL stored procedure 1064 ErrorMySQL存储过程1064错误
【发布时间】:2013-11-26 22:32:00
【问题描述】:

对于我的一生,我无法弄清楚为什么会出现此错误:

[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//

【问题讨论】:

  • 您在使用之前是否在某处声明了 @myPrep
  • 我认为不需要。在这方面,我有另一个使用相同语法运行良好的程序。
  • 如果使用局部变量,必须在使用前声明。如果使用全局变量,则不需要声明,因为系统之前已经声明了它。另外,检查你的mysql安装。较新的版本收紧了以前版本中的一些宽松规则。
  • 好的,谢谢。我会四处寻找并宣布它,看看会发生什么。
  • DELIMITER //放在CREATE PROCEDURE...之前

标签: mysql stored-procedures


【解决方案1】:

我正在回答我自己的问题,因为我发现了为什么准备好的语句不起作用,而且它非常简单愚蠢,但将来可能会影响其他人。在我们公司,我们习惯于在声明变量时排列所有等号(参见上面的编辑)。好吧,似乎 MySQL 不喜欢这种方式的空格,所以全局变量没有在准备好的语句中正确传递。通过将声明更改为:

/* Globals */
SET @dest_database = 'my_db';
SET @table_category_management_pages = 'category_management_pages';

...效果很好。去搞清楚。 cmets 中的两个建议都很好,但最终这是由于空格造成的。非常令人沮丧,但我希望这对将来的人有所帮助。

【讨论】:

  • 似乎除了空格之外还必须有其他东西; MySQL 对等号间隔没有问题,您可以通过设置变量来确认这一点,然后 SELECT @dest_database, @table_category_management_pages; 以确认分配有效......但错误消息确实表明某些东西是空的,因为 concat () 如果任何参数为 null,则返回 null,如果 @foo 为 null,PREPARE STMT FROM @foo 将返回该确切错误。我假设您知道这些实际上不是“全局”变量,它们是用户定义的变量,具有会话范围。
猜你喜欢
  • 1970-01-01
  • 2015-09-22
  • 2018-06-21
  • 1970-01-01
  • 2012-08-02
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多