Felmeddelandet är ganska uppenbart, du kan inte släppa en tillfällig tabell medan den används.
Du kanske kan undvika problemet genom att lägga till ON COMMIT DROP
:
Detta kan dock förmodligen vara enklare. Om du inte behöver alla dessa temporära tabeller till att börja med (vilket jag misstänker), du kan ersätta dem alla med CTEs (eller de flesta av dem förmodligen till och med med billigare subqueries) och förenkla till en stor fråga. Kan vara plpgsql eller bara 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;
Visningar lagrar bara en fråga ("receptet"), inte de faktiska resulterande värdena ("soppan").
Det är vanligtvis billigare att använda CTE istället för att skapa tillfälliga tabeller.
Härledda tabeller i frågor , sorterade efter deras typiska övergripande prestanda (undantag för speciella fall som involverar index). Från långsam till snabb:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
skulle försöka vika dubbletter av rader. Vanligtvis vill folk verkligen ha UNION ALL
, som bara lägger till rader. Snabbare och försöker inte ta bort duper.