哪位大神给一个 golang 访问 postgres 的 stored procedure 的例子代码啊?

215 天前
 zhwguest

用的是 postgres 11 ,现在想简单试一下(当然这个例子本身没有太多实际用途)。比如根据 id 找到名字。

CREATE TABLE tabnames(
    id SERIAL PRIMARY KEY,
    name TEXT
);

CREATE OR REPLACE PROCEDURE get_id_by_name(in_id BIGINT, INOUT out_name TEXT)
LANGUAGE plpgsql
AS $$
BEGIN
    SELECT name INTO out_name FROM tabnames WHERE id = in_id;
END;
$$;

我想在 golang 中通过call get_id_by_name()获取返回的out_name。怎么都不成功,out_name总是空的。 另外,我如果在 psql 命令中,如何调用上面这个 sp ,然后获取名字啊?

先感谢各位,再啰嗦一句,这个例子只是为了看看语法上怎么调用。并不讨论实际的目的,当然不想用一个select name from tabnames where id=$1来 exec 然后 scan 。

899 次点击
所在节点    PostgreSQL
1 条回复
MajestySolor
215 天前
ai 的回答 😂


以下是一个使用 Golang 访问 PostgreSQL 存储过程的示例代码:

```
Copy
package main

import (
"database/sql"
"fmt"

_ "github.com/lib/pq"
)

func main() {
// 连接到 PostgreSQL 数据库
connStr := "host=localhost port=5432 user=your_username password=your_password dbname=your_database sslmode=disable"
db, err := sql.Open("postgres", connStr)
if err != nil {
panic(err)
}
defer db.Close()

// 准备调用存储过程的 SQL 查询语句
query := "SELECT * FROM your_stored_procedure($1, $2)"

// 执行存储过程并获取结果
rows, err := db.Query(query, "parameter1", "parameter2")
if err != nil {
panic(err)
}
defer rows.Close()

// 处理查询结果
for rows.Next() {
var column1 string
var column2 int
err := rows.Scan(&column1, &column2)
if err != nil {
panic(err)
}
fmt.Println(column1, column2)
}

if err = rows.Err(); err != nil {
panic(err)
}
}
```

请确保将 your_username 、your_password 、your_database 和 your_stored_procedure 替换为实际的数据库凭据和存储过程名称。还要根据实际情况修改 PostgreSQL 数据库的连接字符串。

这个示例代码使用 database/sql 包和 github.com/lib/pq 驱动程序来连接和执行 PostgreSQL 数据库的存储过程。首先,它建立到数据库的连接,然后使用 db.Query 方法执行存储过程的 SQL 查询语句,并将参数传递给存储过程。最后,它遍历查询结果并处理每一行的数据。

请根据您的实际情况修改和扩展示例代码。

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

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

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

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

© 2021 V2EX