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