sql语法错误1604

bqucvtff  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(273)

这个问题在这里已经有答案了

创建触发器前分隔符出现mysql语法错误(2个答案)
9个月前关门了。
我使用此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 声明。如果我查看引用,在过程名称后面有一个空格-我也尝试过添加它,但仍然不起作用。
我用的是围棋 db.Exec 方法来执行查询,以便一个接一个地创建表和过程。
我不明白为什么会出现这个错误,因为语法看起来是正确的。在goland的sql runner中也工作过,但在go中不工作。

zlwx9yxi

zlwx9yxi1#

我发现了问题所在:mysql go驱动程序 database/sql 我使用的图书馆, go-sql-driver 默认情况下不支持多语句。它们可以像这里一样被激活,尽管这里有一些限制。
总之,这个问题与框架有关。我希望其他在围棋中遇到同样问题的人会发现这一点很有用,因为乍一看并不是那么明显。另请参见堆栈溢出问题
编辑:编辑 DELIMITER 语句不受服务器本身的支持,但受mysql命令行的支持。即使只是一句话也不行。

sqserrrh

sqserrrh2#

请尝试下面的代码段。 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 ;

相关问题