iakioの日記 RSSフィード

2008-05-13

複数行複数列を返すPL/pgSQL関数

| 21:43 | 複数行複数列を返すPL/pgSQL関数 - iakioの日記 を含むブックマーク はてなブックマーク - 複数行複数列を返すPL/pgSQL関数 - iakioの日記

たまスパ

IN/OUTパラメータが導入されてからset return functionってどう書くのかいまいちわかってなかったので調べてみました。

OUTパラメータを使う(8.1くらい以降)

CREATE OR REPLACE FUNCTION hoge(OUT a integer, OUT b integer, OUT c integer)
RETURNS SETOF RECORD AS '
BEGIN
  SELECT 1, 2, 3 INTO a, b, c;
  RETURN NEXT;
  RETURN;
END
' LANGUAGE plpgsql;
SELECT * FROM hoge();

引数無しのRETURN NEXTを使うのがポイントのようです。

で、次の2つは伝統的な方法。

CREATE TYPEする

CREATE TABLEでもいいけど。

CREATE TYPE hoge_type AS (a integer, b integer, c integer);
CREATE OR REPLACE FUNCTION hoge()
RETURNS SETOF hoge_type AS '
DECLARE
  rec RECORD;
BEGIN
  SELECT 1 AS a, 2 AS b, 3 AS c INTO rec;
  RETURN NEXT rec;
  RETURN;
END
' LANGUAGE plpgsql;
SELECT * FROM hoge();

aliasを使う

RETURNS SET OF RECORDでも、SELECTする時に明示的に型指定することができます。

CREATE OR REPLACE FUNCTION hoge()
RETURNS SETOF RECORD AS '
DECLARE
  rec RECORD;
BEGIN
  SELECT 1 AS a, 2 AS b, 3 AS c INTO rec;
  RETURN NEXT rec;
  RETURN;
END
' LANGUAGE plpgsql;
=> SELECT * FROM hoge() AS (a integer, b integer, c integer);
 a | b | c
---+---+---
 1 | 2 | 3
(1 row)

LarkLark2012/01/12 03:40Percfet shot! Thanks for your post!

vyrugouvyrugou2012/01/12 18:07WqdaHu <a href="http://bikcuisoadpz.com/">bikcuisoadpz</a>

mgkcabbquvxmgkcabbquvx2012/01/13 23:30ET5tQD , [url=http://oisjuydxiaem.com/]oisjuydxiaem[/url], [link=http://okvxreacafxh.com/]okvxreacafxh[/link], http://yggbtzibtmma.com/

htoxjqbvmzhtoxjqbvmz2012/01/14 20:56Olo51I <a href="http://wiqeutrwdgcf.com/">wiqeutrwdgcf</a>

tcreketcreke2012/01/16 20:33QVaXyc , [url=http://mbbmjjjnoxlu.com/]mbbmjjjnoxlu[/url], [link=http://mnpppqwdumdl.com/]mnpppqwdumdl[/link], http://jdoqylxyapyb.com/

トラックバック - http://postgresql.g.hatena.ne.jp/iakio/20080513