【问题标题】:Creating stored procedure on MySQL在 MySQL 上创建存储过程
【发布时间】:2020-03-13 00:29:30
【问题描述】:

我正在尝试运行下面的查询,该查询存储在.sql 文件中,然后使用ioutils.ReadFile 读取并在初始化时执行

CREATE TABLE IF NOT EXISTS districts
(
    GeoCode integer PRIMARY KEY,
    name    varchar(32)
);

drop procedure if exists insert_district;

DELIMITER $$

CREATE PROCEDURE insert_district(in pgeocode int, in pname varchar(32))
BEGIN
    INSERT INTO districts(geocode, name) VALUES (pgeocode, pname);
    SELECT * FROM districts where geocode = pgeocode;
END$$
DELIMITER ;

我正在使用 database/sql 包并使用 Exec 运行查询

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 'drop procedure if exists insert_district;

DELIMITER $$

CREATE PROCEDURE insert' at line 7

据我所知,我的语法是正确的,并且我对其进行了测试,因此我无法弄清楚为什么无法从程序中正确运行相同的确切查询。

【问题讨论】:

    标签: mysql sql go


    【解决方案1】:

    Go MySQL 客户端默认不支持多条 SQL 语句。您不能只用; 分隔语句为其提供文本文件。

    有关详细信息,请参阅 Does a Go Mysql driver exist that supports multiple statements within a single string? — 您可以使用一个选项来允许多语句。

    但这仍然不支持像 DELIMITER 这样的语句,它们不能被 MySQL 服务器识别。那是mysql client command

    你有两种选择:

    • 解析 .sql 文件以查找语句终止符并一次运行一条语句。
    • 使用 .sql 文件作为输入在子进程中执行 mysql 客户端。

    【讨论】:

    • 谢谢我决定使用多个语句,虽然我不得不删除分隔符命令。
    • 当然,您不需要DELIMITER,除非您使用mysql 客户端将整个文件作为脚本运行。 DELIMITER 的目的是解决 ; 作为过程体内部语句的语句终止符的歧义,同时也是整个 CREATE PROCEDURE 语句的语句终止符。如果您使用 API 一次执行一条语句,则没有歧义。
    猜你喜欢
    • 2016-11-11
    • 2017-10-14
    • 2021-07-10
    • 2015-08-27
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2014-09-29
    • 2012-05-28
    相关资源
    最近更新 更多