[pgsql-jp: 25462] Re: PL/pgSQLで一時テーブルの作成、挿入、削除の問題

Tatsuo Ishii t-ishii @ sra.co.jp
2002年 3月 28日 (木) 18:27:13 JST


石井です.

> ;;; 石井@逃避モードです.時間がないので結論のみ書きます.解説は他の方にお
> ;;; 願い.
> ;;; 
> ;;; create function test()
> ;;; returns double precision as'
> ;;; declare
> ;;;   mval record;
> ;;; begin
> ;;; 
> ;;;   create temp table test(value double precision);
> ;;; 
> ;;;   execute ''insert into test values(random())'';
> ;;;   execute ''insert into test values(random())'';
> ;;; 
> ;;;   for mval in execute ''select sum(value) as s from test'' loop
> ;;;   end loop;
> ;;; 
> ;;;   drop table test;
> ;;; 
> ;;;   return mval.s;
> ;;; 
> ;;; end;
> ;;; ' language 'plpgsql';
> 
>   リレーション test は、関数の最初のパーズ時に test の oid にマップされます。
> そして、test が DROP された後も test は、先の oid にマップされたままとなります。
> 次に関数が実行されたときに、新たにリレーション test が新しい oid で作成されま
> すが、関数内では、前の oid にマップされたままなので INSERT が失敗します。
> 
>   回避策は、execute 文によって実行時にパーズを行うことで、リレーション test に
> 新しいoid が使われるようにすることです。

本題と離れますが,

for mval in execute ''select sum(value) as s from test'' loop

のループ変数mvalはレコード型にしています.本来ここではこれはレコード型
である必要はないので,

val float;
:
for val in execute ''select sum(value) as s from test'' loop

としてもみたのですが,

NOTICE:  plpgsql: ERROR during compile of test near line 12
ERROR:  missing .. at end of SQL expression

と怒られちゃうんですよね.なぜかなー
--
Tatsuo Ishii



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