【发布时间】: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 运行器一次性测试了执行
DELIMITER、DROP、CREATE和另一个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语句似乎有问题,因为它在我尝试创建的下一个过程中给了我同样的错误。