请教个 GO 调用 MySQL 存储过程的问题

2021-12-13 13:08:54 +08:00
 leonidas

问题如下: 现有个存储过程如下(只是随便举个例子):

CREATE PROCEDURE test(
	UID INT,
	OUT Ret1 VARCHAR(200),
	OUT Ret2 VARCHAR(200),
)
BEGIN
	SET Ret1 = "test ret1";
	SET Ret2 = "test ret2";
	
	SELECT * FROM user;
	SELECT * FROM phones;
END

GO 里如何调佣这个存储过程获取 Ret1 、Ret2 出参,及获取 user 、phones 的两个结果集呢

翻遍了度娘和谷哥没找到想要的答案,求助 V 友

1011 次点击
所在节点    问与答
4 条回复
wd
2021-12-13 13:21:16 +08:00
按说 procedure 应该是需要类似函数那样显式声明 输入和输出的吧?就是输入应该在定义里面,输出是通过 return 之类。我感觉你举的栗子就没有输入输出,你无法获取
gamexg
2021-12-13 13:46:31 +08:00
```

package main

import (
"database/sql"

"fmt"

_ "github.com/denisenkom/go-mssqldb"
_ "github.com/go-sql-driver/mysql"
)

func main() {
db, err := sql.Open("mssql", `server=1.2.3.4;user id=test;password=test;encrypt=disable;database=test`)
if err != nil {
panic(err)
}

if err := db.Ping(); err != nil {
panic(err)
}

tx, err := db.Begin()

row := tx.QueryRow(`DECLARE @o_id int

EXEC [dbo].[AAAAAAA]
@serverid = ?,
@o_id = @o_id OUTPUT;

SELECT @o_id as N'@o_id' `, 99)

id := 0
if err := row.Scan(&id); err != nil {
panic(err)
}

fmt.Print(id)

if err := tx.Commit(); err != nil {
panic(err)
}

/*
id, err := result.LastInsertId()
if err != nil {
panic(err)
}*/
return

}

```
leonidas
2021-12-13 20:13:27 +08:00
@wd OUT 关键字就是定义出参的 下面的 SELECT 查询语句是查询结果集
leonidas
2021-12-13 20:23:03 +08:00
@gamexg 我用 mysql 跑的好像不行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/821841

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX