2016-06-27 9 views
5

私は非常にグーグルグーグルであり、かなり読書力がありますが、このスクリプトがpostgres/postgisボックスの複数のスレッドで動作するかどうかは分かりません。ここでは、コードです:だからPostgreSQL Temp Tableの有効範囲は何ですか?

Do 
$do$ 
DECLARE 
    x RECORD; 
    b int;  
    begin 
    create temp table geoms (id serial, geom geometry) on commit drop; 

    for x in select id,geom from asdf loop 

     truncate table geoms; 
     insert into geoms (geom) select someGeomfield from sometable where st_intersects(somegeomfield,x.geom); 

     ----do something with the records in geoms here...and insert that data somewhere else 

    end loop; 
end; 
$do$ 

私は、Javaから呼び出された複数のクライアント、でこれを実行する場合、のgeomの一時テーブルの問題を引き起こすの範囲だろうか?もしそうなら、PostGresでこれを解決するためのアイデアが役に立ちます。

感謝のPostgreSQL(またはPostgresの)中

答えて

3

1つの微妙なトラップが実行されるので、私はそれが "安全"と宣言する準備がまだ整っていないのですが、そのスコープはセッションごとですが、 。

私は、あなたが関数を実行した後に明示的にドロップするために関数の後に一時テーブルを必要としない方がずっと良いと思います。これにより、同じトランザクションで関数を2回実行しようとすると発生する問題を防ぐことができます。 (コミットでは、あなたが落ちている)

+0

おかげでクリス...私は "コミットドロップDDLの"ので、 "コミット"は、呼び出しが完了した時にテンションテーブルが落とされたと考えて...私はあなたのことを聞いて安全です。 – markg

+0

途中でコミットすると、実際のコミットを意味します。 'commit'を呼び出す前に' begin'を使って関数を2回実行すると失敗します。同じクエリで何とか2回呼び出された場合と同じです。 –

1

一時テーブルを(Postgresは存在しない)だけで、ローカルおよびそれらが作成されたセッションに関連しています。他のセッション(クライアント)は、他のセッションからの一時テーブルを見ることができません。両方(スキーマとデータ)は他の人には見えません。あなたのコードは安全です。

関連する問題