【问题标题】:SQL Syntax error 1604 in CREATE PROCEDURE statement [duplicate]CREATE PROCEDURE 语句中的 SQL 语法错误 1604 [重复]
【发布时间】:2020-11-09 02:33:08
【问题描述】:

我正在使用这个 SQL 查询来生成一个过程:

DELIMITER //

DROP PROCEDURE IF EXISTS GetSessionID //
CREATE PROCEDURE GetSessionID(IN token VARCHAR(64), OUT id INTEGER)
BEGIN
    SELECT s.ID INTO id FROM Sessions AS s WHERE s.Token = token;
END //

DELIMITER ;

我收到以下错误消息:

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your   MySQL server version for the right syntax to use near 'DELIMITER //

DROP PROCEDURE IF EXISTS GetSessionID //
CREATE PROCEDURE "GetSessi' at line 1

我还尝试使用$$ 作为分隔符,用双引号将过程名称括起来,并删除DROP 语句和END 语句中分隔符之前的空格。如果我查看reference,在过程名称后面有一个空格 - 我也尝试添加它,但仍然不起作用。

我正在使用 Go 的 db.Exec 方法一个接一个地执行创建表和过程的查询。

我不明白为什么会出现此错误,因为语法对我来说是正确的。也在 Goland 的 SQL 运行器中工作,在 Go 中不起作用。

【问题讨论】:

  • 由于错误从一开始就开始 - 那里一定有问题。您是否尝试同时执行 2 个查询?
  • 我使用 Goland 的 SQL 运行器一次性测试了执行 DELIMITERDROPCREATE 和另一个 DELIMITER 语句的语句。它在那里工作,并且该过程存在于数据库中。或者你所说的“同时”是什么意思?
  • 在数据库上,您可以一次执行所有代码。但是使用框架尝试仅执行该过程。没有分隔符定义,没有删除。只是程序:CREATE PROCEDURE GetSessionID(IN token VARCHAR(64), OUT id INTEGER) BEGIN SELECT s.ID INTO id FROM Sessions AS s WHERE s.Token = token; END
  • 试过了,DELIMITER 语句似乎有问题,因为它在我尝试创建的下一个过程中给了我同样的错误。

标签: mysql sql go


【解决方案1】:

我发现问题出在哪里:我正在使用的database/sql 库的 MySQL Go 驱动程序,go-sql-driver 默认不支持多语句。它们可以在here 中激活,尽管有一些限制,记录在那里。

总之,问题与框架有关。我希望其他在 Go 中遇到相同问题的人会发现这很有用,因为乍一看并不那么明显。另见this Stack Overflow question

编辑:DELIMITER 语句不受服务器本身支持,但受 MySQL 命令行支持。它甚至不能作为单个语句起作用。

【讨论】:

    【解决方案2】:

    请尝试以下代码 sn-p。

    DROP PROCEDURE 语句需要以“;”结尾。需要对表 alias 进行小幅修正。

    DELIMITER //
    
    DROP PROCEDURE IF EXISTS GetSessionID;
    
    CREATE PROCEDURE GetSessionID(IN token VARCHAR(64), OUT id INTEGER)
    BEGIN
      SELECT s.ID INTO id FROM Sessions s WHERE s.Token = token;
    END //
        
    DELIMITER ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      相关资源
      最近更新 更多