Mysql CREATE PROCEDURE语句中的SQL语法错误1604

Mysql CREATE PROCEDURE语句中的SQL语法错误1604,mysql,sql,go,Mysql,Sql,Go,我正在使用此SQL查询生成一个过程: 分隔符// 如果存在GetSessionID,则删除过程// 创建过程GetSessionID(在令牌VARCHAR(64)中,在id整数中) 开始 从会话中将s.ID选择为s,其中s.Token=Token; 结束// 定界符 我收到以下错误消息: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL serve

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

分隔符//
如果存在GetSessionID,则删除过程//
创建过程GetSessionID(在令牌VARCHAR(64)中,在id整数中)
开始
从会话中将s.ID选择为s,其中s.Token=Token;
结束//
定界符
我收到以下错误消息:

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
语句中用双引号括住过程名称,并删除分隔符前的空格。如果我看一下,在过程名称后面有一个空格-我也尝试添加了它,但仍然不起作用

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


我不明白为什么会出现这个错误,因为语法在我看来是正确的。在Goland的SQL runner中也工作过,但在Go中不工作。

请尝试下面的代码片段

删除过程
语句需要以“
结束'。对于表
别名
,需要进行一个小的更正

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 ;

请尝试下面的代码片段

删除过程
语句需要以“
结束'。对于表
别名
,需要进行一个小的更正

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 ;

我发现了问题的实质:我正在使用的库的MySQL Go驱动程序默认不支持多语句。它们可以按中的方式激活,尽管有一些限制,如中所述

总之,这个问题与框架有关。我希望其他在围棋中遇到同样问题的人会觉得这很有用,因为乍一看,这并不明显。另见


编辑:服务器本身不支持
分隔符
语句,但MySQL命令行支持该语句。它甚至不能作为单个语句工作。

我发现了问题的实质:我正在使用的库的MySQL Go驱动程序默认不支持多个语句。它们可以按中的方式激活,尽管有一些限制,如中所述

总之,这个问题与框架有关。我希望其他在围棋中遇到同样问题的人会觉得这很有用,因为乍一看,这并不明显。另见


编辑:服务器本身不支持
分隔符
语句,但MySQL命令行支持该语句。它甚至不能作为一个单独的语句使用。

因为错误从一开始就出现了,所以肯定是出了什么问题。您是否尝试同时执行两个查询?我使用Goland的SQL runner测试了执行
分隔符
、然后执行
拖放
、然后执行
创建
、然后一次性执行另一个
分隔符
语句的语句。它在那里工作,并且过程存在于数据库中。或者你说的“同时”是指其他什么?在数据库上,你可以一次执行所有代码。但使用框架时,请尝试仅执行过程。没有分隔符定义,没有删除。只需过程:
CREATE过程GetSessionID(在tokenvarchar(64)中,OUT id INTEGER)开始从会话中选择s.id INTO id作为s,其中s.token=token;END
尝试了它,似乎
DELIMITER
语句有问题,因为它在我尝试创建的下一个过程中给了我相同的错误。因为错误从一开始就开始了-那里一定有问题。您是否尝试同时执行两个查询?我使用Goland的SQL runner测试了执行
分隔符
、然后执行
拖放
、然后执行
创建
、然后一次性执行另一个
分隔符
语句的语句。它在那里工作,并且过程存在于数据库中。或者你说的“同时”是指其他什么?在数据库上,你可以一次执行所有代码。但使用框架时,请尝试仅执行过程。没有分隔符定义,没有删除。只需过程:
CREATE过程GetSessionID(在tokenvarchar(64)中,OUT id INTEGER)开始从会话中选择s.id INTO id作为s,其中s.token=token;END
尝试了它,似乎
DELIMITER
语句有问题,因为它在我尝试创建的下一个过程中给了我相同的错误。