[pgsql-jp: 28157] Re: PL/pgSQLで行を返すサンプル(7.3にて)

Mashiki mashiki @ yanah.com
2002年 12月 3日 (火) 05:08:11 JST


 Mashikiです。

羽生さん石井さんリプライありがとうございます。

>試してみました。Hogeというテーブルを作成して、それに対する
>条件をつけただけの簡単なものですが、期待通りの動作をしてくれました。

私も早速試してみました。行を返す関数のサポートはあまり注目されて
いませんが本当にすごいです。長くなりそうなので、別のメールで。

>一回ずつreturn nextしないと駄目なのかな〜と思ってループの中に
>放り込んでますが、そんなのいらないよんということであれば、ご指摘
>ください。> ALL

ほんとに同じ感想です。Selectの結果を1行ごとでなく、まとめて返す方法
はないのでしょうか。

特に再帰呼び出しで、下の階層で得られた結果をそのまま返したいところ
なのですが、

create or replace function tree0(int4, int4) returns setof record as '
declare
   rec record;
begin
   for rec in
      select  id, $2
      from treetest
      where pid = $1
   loop
      return next rec;
      return next tree0(rec.id, $2+1); /* この行に注目! */
   end loop;
   return;
end;
' language 'plpgsql';

くらいのコーディングで書きたいところを、あまり意味のない変数定義と
selectとloopを書かなければならず、少々悔しい思いです。

create or replace function tree0(int4, int4) returns setof record as '
declare
   rec1 record;
   rec2 record;
begin
   for rec1 in
      select  id, $2
      from treetest
      where pid = $1
   loop
      return next rec1;
      for rec2 in
         select *
         from tree0(rec1.id, $2+1) as t(id int4, level int4)
      loop
         return next rec2;
      end loop;
   end loop;
   return;
end;
' language 'plpgsql';



pgsql-jp メーリングリストの案内