用的是 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 。
1
MajestySolor 2023-10-20 14:31:34 +08:00 1
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 查询语句,并将参数传递给存储过程。最后,它遍历查询结果并处理每一行的数据。 请根据您的实际情况修改和扩展示例代码。 |