エラーメッセージはかなり明白です。使用中に一時テーブルを削除することはできません。
ON COMMIT DROP
を追加すると、問題を回避できる場合があります。 :
ただし、これはおそらくもっと簡単な場合があります。 必要がない場合 そもそもこれらすべての一時テーブル(私が思うに)は、それらすべてをCTE(またはおそらくそれらのほとんどはより安価なサブクエリ)に置き換えて、1つの大きなクエリに単純化することができます。 plpgsqlまたはSQLのみにすることができます:
CREATE FUNCTION everything(waypoints)
RETURNS TABLE(node int, xy text[]) AS
$func$
WITH bbox AS (SELECT ... FROM waypoints) -- not the fct. parameter!
, b_spaces AS (SELECT ... )
, b_graph AS (SELECT ... )
, local_green AS (SELECT ... )
, aug_temp AS (SELECT ... )
, b_graph2(source, target, cost) AS (
SELECT ... FROM b_graph
UNION ALL -- guessing you really want UNION ALL
SELECT ... FROM aug_temp
UNION ALL
SELECT ... FROM aug_temp
)
, results AS (SELECT id1, ... FROM b_graph2)
, pkg AS (SELECT loc, ... )
SELECT id1, array_agg(loc)
FROM pkg
GROUP BY id1
$func$ LANGUAGE sql;
ビューは、実際の結果の値(「スープ」)ではなく、クエリ(「レシピ」)を格納しているだけです。
通常、一時テーブルを作成する代わりにCTEを使用する方が安価です。
クエリで派生テーブル 、典型的な全体的なパフォーマンスでソートされます(インデックスを含む特別な場合を除く)。遅いものから速いものへ:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
重複する行を折りたたむことを試みます。通常、人々は本当にUNION ALL
を望んでいます 、行を追加するだけです。より速く、重複を削除しようとはしません。