使用Go MySQL无法检索输出参数

时间:2019-08-20 22:35:55

标签: mysql go stored-procedures

我有一个存储过程,该存储过程插入一个实体并返回其新的UUID,尽管我可以生成代码以创建正确的查询,但是使用go-sql-driver/mysql时它会出错。所以下面的代码...

func test_insert() *sql.Rows {
    db := openDbConnection()

    defer db.Close()

    results, err := db.Query("call saveargument(null, 'Test Argument', 'Test Argument', '1', null, null, null, 1, 'test_user', @newargumentid);\nselect @newargumentid;")

    toolkit.HandleError(err)

    return results
}

func openDbConnection() *sql.DB {
    var db, err = sql.Open("mysql", getConnectionString(entities.GetConfig()))

    toolkit.HandleError(err)

    return db
}

...产生以下错误:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本以使用正确的语法   在第2行的“ select @newargumentid”附近

我不确定为什么这样的基本SQL可能会引起问题。任何有见识的人吗?

2 个答案:

答案 0 :(得分:2)

在一次db.Query()调用中,您不能运行多个语句。所有编程语言中的大多数查询接口都是如此。

在对db.Query()的一次调用中调用存储过程,然后在对select @newargumentid的第二次调用中查询db.Query()

答案 1 :(得分:0)

我刚刚测试了@Bill的答案,我可以确认它在Go1.14中不起作用。我的解决方法是通过在最后进行选择来将存储过程重写为“返回”值:

CREATE PROCEDURE foo()
BEGIN
    # do stuff...

    SELECT 'bar';
END;

然后在Go语言中像其他查询一样读取它:

res, _ := db.Query("CALL foo()")
res.Next()
var bar string
res.Scan(&bar)
println(bar)

请注意,此方法也适用于多列和多行。