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") を持つ列は 1 つしかありません。

したがって、ここで何が間違っているのか、何をしていないのかわかりません。PL/pgSQL コードですか、それとも SOCI コードですか? SOCI は、ストアド プロシージャの動的バインドをサポートしていない可能性があります。また、この方法では最初の行のみを読み取ることができますが、残りの行はどうでしょうか? SOCIにはrowset結果セットを読み取るためのクラスが付属していることは知っていますが、ドキュメントにはクエリでのみ機能すると書かれています。助けてください。

4

1 に答える 1

1

SELECT get_people()peopleは、プロシージャにちなんで名付けられたtype の単一の列を返します。

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 に答える