无法使用Go MySQL检索输出参数
我有一个存储过程,它插入一个实体并返回它的新UUID,虽然我可以生成代码来创建正确的查询,但在使用go sql driver/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'
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。