ユーザ定義関数で複数行を返却

こんなこと出来るなんて知りませんでした。

create or replace function virtual_table() RETURNS setof text AS $$
begin
    return next 'abc';
    return next 'def';
end;
$$ language plpgsql;

RETURNS setof [type] と return next を忘れず追加。
from句で使用する関数となる。

実行結果

# select * from virtual_table();
 virtual_table 
---------------
 abc
 def
(2 rows)