この記事は公開から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
と列定義リストを利用しても、同様の結果を得られます。
参考ウェブサイトなど
-
PostgreSQL Docs
34.4.8. TABLEを返すSQL関数 -
PostgreSQL Docs
34.4.7. 集合を返すSQL関数
以上です。
コメント
はじめまして。
千葉県でIT関連事業の会社代表を務めています。
とある開発案件でPostgreSQLを使うことになり、いろいろ情報収集をしている中で、こちらのサイトに辿り着きました。
私はOracleの経験が長いのですが、PostgreSQLって結構便利機能が多いですね。
これでオープンソフトウェアとは驚きです(笑)
特に、このようなFunctionをテーブルとして利用できると、使い方次第で非常に効果的に使えそうなのでありがたいですね。
こちらに掲載されている他の記事も色々参考にさせて頂きます!
コメントありがとうございます。
1年前の古い記事ですが、お役に立てたようで幸いです。
私自身は広く色々な技術やDBに触れているためあまり詳しくありませんが、PostgreSQLは使っていると良くできている良いDBだと感じます。
特に昨今の開発で需要が高い
・DBレベルでのJsonサポートが充実している。
・リアルタイム性の高いプッシュ型のDB変更通知(Notify)が扱いやすい。
という部分も、PostgreSQLを使う際に個人的に感じた良い点です(それぞれのDBに利点、欠点はありますが)。
最近は殆どPostgreSQLに触れられていませんが、また何か気づきがありましたら記事にしたいと思いますので、今後ともよろしくお願いいたします。