Fejlmeddelelsen er ret indlysende, du kan ikke slippe en midlertidig tabel, mens den bruges.
Du kan muligvis undgå problemet ved at tilføje ON COMMIT DROP
:
Dette kan dog nok være enklere. Hvis du ikke bruger alle disse midlertidige tabeller til at begynde med (som jeg formoder), du kan erstatte dem alle med CTE'er (eller de fleste af dem sandsynligvis endda med billigere underforespørgsler) og forenkle til en stor forespørgsel. Kan være plpgsql eller bare 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;
Visninger gemmer kun en forespørgsel ("opskriften"), ikke de faktiske resulterende værdier ("suppen").
Det er typisk billigere at bruge CTE'er i stedet for at oprette midlertidige tabeller.
Afledte tabeller i forespørgsler , sorteret efter deres typiske overordnede ydeevne (undtagelser for særlige tilfælde, der involverer indekser). Fra langsom til hurtig:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
ville forsøge at folde duplikerede rækker. Typisk vil folk virkelig have UNION ALL
, som blot tilføjer rækker. Hurtigere og forsøger ikke at fjerne duper.