1

複数のテーブルから結果を返す必要がある関数があります。Postgresql (現在 9.1、まもなく 9.2 への移行を計画中) でこれを行うことは可能ですか? もしそうなら、どのように。

例えば

create or replace function f1()
returns ???
as $body$ begin
    return query select x.*
        from users x;
    return query select x.*
        from user_preferences x join users y using(user_id) ; -- more where clauses
    return query select x.*
        from user_permissions x join users y using(user_id) ; -- more clauses
end; $body$ language 'plpgsql';

(a) users と user_preferences (など) のデカルト積を実行しますが、それは巨大な結果テーブルと本当に複雑なコードにつながります。(b) 最初にユーザーの選択を行い、次にユーザーのリストを反復し、その属性に応じて追加の反復を行いますが、データベース呼び出しが多すぎます。そして、なぜ SQL が非常に優れたコードを書く必要があるのでしょうか?

pg関数から複数の結果セットを取得する明確な方法はありますか? postgresql のドキュメントを検索しましたが、ガイダンスが見つかりませんでした。

どうもありがとう。

4

1 に答える 1

5

Pg (執筆時点) はストアド プロシージャをサポートしておらず、SQL から呼び出し可能な関数のみをサポートしているため、複数の結果セットを直接返すための規定はありません。

ただし、関数を として定義できますRETURNS SETOF refcursor。この関数は、複数の一時テーブルを作成し、各テーブルのカーソルを開き、カーソルを返すことができます。

これは少し扱いに​​くいですが、効果的です。

于 2013-02-21T04:04:47.047 に答える