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

sugita @ sra.co.jp sugita @ sra.co.jp
2002年 3月 28日 (木) 17:25:25 JST


  杉田です。

From: Tatsuo Ishii <t-ishii @ sra.co.jp>
Subject: [pgsql-jp: 25456] Re: PL/pgSQLで一時テーブルの作成、挿入、削除の問題
Date: Thu, 28 Mar 2002 16:43:10 +0900

;;; > 次のような現象で困っております。
;;; > 
;;; > PL/pgSQLの関数で、一時テーブルを作成し、作成したテーブルに行
;;; > を挿入し、作成したテーブルを削除しています。この関数を1回目
;;; > に実行したときは、正常に動作するのですが、2回目以降動作しま
;;; > せん。
;;; 
;;; 石井@逃避モードです.時間がないので結論のみ書きます.解説は他の方にお
;;; 願い.
;;; 
;;; 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 が使われるようにすることです。


Kenji Sugita
sugita @ sra.co.jp



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