[pgsql-jp: 35178] Re: PL/pgSQLの再帰処理の基本について

小川 修 shuogawa @ mister.co.jp
2005年 4月 4日 (月) 19:33:24 JST


石田様 アドバイスありがとうございます。

ご指摘頂いた方法を試しました。

結果

 -------------------------------------------------------------
 1,  CREATE OR REPLACE FUNCTION "public"."func_test" (integer) RETURNS 
boolean
 2,  AS'
 3,  declare
 4,  var1 alias for $1;
 5,  var_id integer;
 6,  var_record record;
 7,  begin
 8,  --引数のidのflagを1に変更
 9,  UPDATE test set flag=1 where id=var1;
10, --子階層を検索
11, FOR var_record IN select * from test where parent=var1 LOOP
12,     var_id:=var_record."id";
13,     --子階層のidを引数として、再帰呼び出しを実行
14,     perform func_test(var_id);
15, END LOOP;
16, return true;
17, end;
18, 'LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
--------------------------------------------------------------

14行目をexecuteからperfomに変更
16行目をreturn;からreturn true;に変更

以上によりまして、動作させることが出来ました。
誠にありがとうございました。

16行目は関数の戻り値をbooleanにしていたので、当然かと思います。
ただ、

14行目を変更した意味についてはまだ理解できておりません。

よろしければ、executeとperformの違いをご指摘いただけますでしょうか?

はやくPL/pgSQLでPostgreSQLを自在に操作できるようになりたいのですが、
エラーの出力から原因の特定に結びつけることができません。
勉強が必要だと感じてます。今後ともよろしくお願いします。

以上になります。よろしくお願いします。

小川 修






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