我有一个存储过程,该存储过程插入一个实体并返回其新的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可能会引起问题。任何有见识的人吗?
答案 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)
请注意,此方法也适用于多列和多行。