为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
长风秋雁 2023-07-17 09:52:59
我有一个存储过程,它插入一个实体并返回其新的 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 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2023-07-17
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

我可以确认它在 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)

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


查看完整回答
反对 回复 2023-07-17
  • 2 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信