PostgreSQLのストアドファンクションからSELECT結果を返す方法

この記事は公開から3年以上経過しています。

PostgreSQLのストアドファンクション内でSELECTした結果のレコードを返す方法の備忘録。

サンプルソースコード

テストテーブル構成

CREATE TABLE user_master (
    id bigint NOT NULL,
    name text
);

INSERT INTO user_master (id, name)
    VALUES (100, 'Foo');

INSERT INTO user_master (id, name)
    VALUES (101, 'Bar');

INSERT INTO user_master (id, name)
    VALUES (102, 'Baz')

ストアドファンクション定義

CREATE FUNCTION get_users ()
    RETURNS TABLE (
        id bigint,
        name text
    )
    AS $$
BEGIN
    RETURN query
    SELECT
        *
    FROM
        user_master;
END;
$$
LANGUAGE plpgsql;

※select文で*ではなくカラム名を指定する場合は、returns tableのカラム名定義と重複しないように列名にテーブル名を付けるなどの対応が必要。

結果

SELECT
    *
FROM
    get_users ();
id name
100 Foo
101 Bar
102 Baz

ちなみに、テーブルではなく集合を使い

CREATE FUNCTION get_users ()
    RETURNS SETOF record
    AS $$
BEGIN
    RETURN query
    SELECT
        *
    FROM
        user_master;
END;
$$
LANGUAGE plpgsql;
SELECT
    *
FROM
    get_users ()
    AS (id bigint, name text);

のようにsetof recordと列定義リストを利用しても、同様の結果を得られます。

参考ウェブサイトなど

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. r.kashiwagi より:

    はじめまして。
    千葉県でIT関連事業の会社代表を務めています。

    とある開発案件でPostgreSQLを使うことになり、いろいろ情報収集をしている中で、こちらのサイトに辿り着きました。
    私はOracleの経験が長いのですが、PostgreSQLって結構便利機能が多いですね。
    これでオープンソフトウェアとは驚きです(笑)

    特に、このようなFunctionをテーブルとして利用できると、使い方次第で非常に効果的に使えそうなのでありがたいですね。

    こちらに掲載されている他の記事も色々参考にさせて頂きます!

    • Y.Sakamoto より:

      コメントありがとうございます。

      1年前の古い記事ですが、お役に立てたようで幸いです。

      私自身は広く色々な技術やDBに触れているためあまり詳しくありませんが、PostgreSQLは使っていると良くできている良いDBだと感じます。

      特に昨今の開発で需要が高い

      ・DBレベルでのJsonサポートが充実している。
      ・リアルタイム性の高いプッシュ型のDB変更通知(Notify)が扱いやすい。

      という部分も、PostgreSQLを使う際に個人的に感じた良い点です(それぞれのDBに利点、欠点はありますが)。

      最近は殆どPostgreSQLに触れられていませんが、また何か気づきがありましたら記事にしたいと思いますので、今後ともよろしくお願いいたします。