2016-09-28 37 views
1

我有这个PostgreSQL的PL/pgSQL函数:如何使用SOCI进行动态绑定到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类读取结果集,但文档说它只适用于查询。请帮忙。

回答

1

SELECT get_people()将返回单个列,类型为people,以该过程命名。

SELECT * FROM get_people()会给你预期的行为,在people记录分解成它们的成分领域。

source来看,它看起来像SOCI procedure类(或至少,其Postgres的实现)是硬连接到运行程序为SELECT ...,而不是SELECT * FROM ...

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

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

是的,现在我明白了!对于不返回任何东西的函数,您应该使用'procedure'类,但对于返回查询结果的函数,您必须使用'statement'类并编写一个调用函数的查询(就像在SQL中那样)。一旦你意识到这一点,你知道你可以用'rowset'类使用相同的方法获得多行。谢啦。 – eXe

相关问题