[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 メーリングリストの案内