1

我有这个 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用于读取结果集的类,但文档说它只适用于查询。请帮忙。

4

1 回答 1

1

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

SELECT * FROM get_people()将为您提供预期的行为,将people记录分解为其组成字段。

源代码来看,看起来 SOCIprocedure类(或者至少是它的 Postgres 实现)是硬连线来运行程序SELECT ...而不是SELECT * FROM ....

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

statement stmt = (sql.prepare << "SELECT * FROM get_people()", into(person));
于 2016-09-28T04:51:48.320 回答