如何使用 SOCI 动态绑定到 PL/pgSQL 函数?
How to do a dynamic binding to a PL/pgSQL function using SOCI?
我有这个 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
class 用于读取结果集,但文档说它只适用于查询。请帮忙。
SELECT get_people()
将 return 类型为 people
的单个列,以过程命名。
SELECT * FROM get_people()
将为您提供预期的行为,将 people
记录分解为其组成字段。
从 source 来看,似乎 SOCI procedure
class(或者至少,它的 Postgres 实现)是硬连接到 运行 过程的SELECT ...
而不是 SELECT * FROM ...
.
我想这意味着您需要编写自己的查询,即:
statement stmt = (sql.prepare << "SELECT * FROM get_people()", into(person));
我有这个 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
class 用于读取结果集,但文档说它只适用于查询。请帮忙。
SELECT get_people()
将 return 类型为 people
的单个列,以过程命名。
SELECT * FROM get_people()
将为您提供预期的行为,将 people
记录分解为其组成字段。
从 source 来看,似乎 SOCI procedure
class(或者至少,它的 Postgres 实现)是硬连接到 运行 过程的SELECT ...
而不是 SELECT * FROM ...
.
我想这意味着您需要编写自己的查询,即:
statement stmt = (sql.prepare << "SELECT * FROM get_people()", into(person));