Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用Go MySQL检索输出参数_Mysql_Go_Stored Procedures - Fatal编程技术网

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

无法使用Go MySQL检索输出参数,mysql,go,stored-procedures,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'

我有一个存储过程,它插入一个实体并返回它的新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会有如此大的问题。任何人有任何见解吗?

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


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

我刚刚测试了@Bill的答案,我可以确认它在Go1.14中不起作用。我的解决方法是通过在末尾执行select来重写存储过程以返回值:

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)

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

明白了。我习惯于使用C和ADO.NET,这类东西更直观一些。我为这个存储过程创建了一个工作环境,它工作得很好,所以我知道这是未来的一个限制。请注意,这种从过程中获取输出的方法从Go1.14开始就不起作用。实际上,我不相信它曾经起作用。为什么它不起作用?对db.Query的后续调用是否不能保证使用相同的MySQL会话?@PhillipElm,谢谢,我理解在使用事务时是如何工作的。我的意思是,如果您不想在单个事务中对语句进行分组,您仍然可以确保相同的连接,因此可以使用会话状态,如用户定义的变量。@PhillipElm如果存储过程返回结果集,则必须使用Query。