如何使用SOCI动态绑定到PL/pgSQL函数

How to do a dynamic binding to a PL/pgSQL function using SOCI?

本文关键字:pgSQL 函数 PL 何使用 SOCI 动态绑定      更新时间:2023-10-16

我有这个PostgreSQL PL/pgSQL函数:

CREATE OR REPLACE FUNCTION get_people()
RETURNS SETOF people AS $$
BEGIN
RETURN QUERY SELECT * FROM people;
END;
$$ LANGUAGE plpgsql;
然后我尝试使用SOCI读取应用程序中的数据,代码如下:
session sql {"postgresql://dbname=postgres"};
row person {};
procedure proc = (sql.prepare << "get_people()", into(person));
proc.execute(true);

我希望person有第一个人的数据,但它只包含存储过程名称的一列(即"get_people")。

所以我不知道我在这里做错了什么,或者没有做。是PL/pgSQL代码还是SOCI代码?也许SOCI不支持存储过程的动态绑定。而且,这个方法只允许我读取第一行,但是其余的行呢?我知道SOCI随rowset类一起提供,用于读取结果集,但文档说它只适用于查询。请帮助。

SELECT get_people()将返回以过程命名的people类型的单列。

SELECT * FROM get_people()将给你期望的行为,将people记录分解成它们的组成字段。

从源代码来看,看起来SOCI procedure类(或者至少是它的Postgres实现)是硬连接到以SELECT ...而不是SELECT * FROM ...的方式运行过程的。

我猜这意味着你需要编写自己的查询,即:

statement stmt = (sql.prepare << "SELECT * FROM get_people()", into(person));