9.7. テーブル関数

テーブル関数は、基本 (スカラ) データ型あるいは複合 (複数列) データ型のいずれかからなる行のセットを生成する関数です。 これらは、問い合わせの FROM 句の、テーブル、ビュー、あるいは副選択のように使用することができます。 テーブル関数によって返される列は、テーブル、ビュー、あるいは副選択の列と同じ方法で、SELECTJOIN、あるいは WHERE 句に含めることができます。

テーブル関数が基本データ型を返す場合は、その関数用の名前が単一の結果の列に付けられます。 関数が複合型を返す場合は、型の個別の属性名に従って各列に名前が付けられます。

テーブル関数には、FROM 句で別名を付けることができますが、別名を付けずにそのままにすることもできます。 FROM 句で別名なしで関数を使用すると、関数の名前がリレーション名として使用されます。

テーブル関数は、テーブルが動作する SELECT 文で動作します。 例えば、

CREATE TABLE foo (fooid int, foosubid int, fooname text);

CREATE FUNCTION getfoo(int) RETURNS setof foo AS '
    SELECT * FROM foo WHERE fooid = $1;
' LANGUAGE SQL;

SELECT * FROM getfoo(1) AS t1;

SELECT * FROM foo
WHERE foosubid in (select foosubid from getfoo(foo.fooid) z
                   where z.fooid = foo.fooid);

CREATE VIEW vw_getfoo AS SELECT * FROM getfoo(1);
SELECT * FROM vw_getfoo;

上記はすべて有効な文です。

起動される方法によって異なる列セットを返すことができるテーブル関数を定義すると、便利な場合があります。 これを行うために、テーブル関数は疑似型である record を返すように宣言することができます。 このような関数を問い合わせで使用する際には、問い合わせ自体に予定される行構造を指定する必要があります。これにより、この問い合わせを解析および計画する方法をシステムが認識できます。 次の例を考えてみてください。

SELECT *
FROM dblink('dbname=template1', 'select proname, prosrc from pg_proc')
  AS t1(proname name, prosrc text)
WHERE proname LIKE 'bytea%';

dblink 関数はリモートの問い合わせ (contrib/dblink) を実行します。 どのような問い合わせでも使用できるように、dblinkrecord を返すように宣言されています。 実際の列セットは、例えば * が何に展開されるのかをパーサーが知ることができるように、呼び出し側の問い合わせ内で指定されている必要があります。