De foutmelding is nogal voor de hand liggend, je kunt een tijdelijke tabel niet laten vallen terwijl deze in gebruik is.
U kunt het probleem mogelijk voorkomen door ON COMMIT DROP
toe te voegen :
Dit kan echter waarschijnlijk eenvoudiger. Als u niet nodig al die tijdelijke tabellen om mee te beginnen (wat ik vermoed), je kunt ze allemaal vervangen door CTE's (of de meeste waarschijnlijk zelfs met goedkopere subquery's) en vereenvoudigen tot één grote query. Kan plpgsql of alleen SQL zijn:
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;
Weergaven slaan alleen een zoekopdracht op ("het recept"), niet de werkelijke resulterende waarden ("de soep").
Het is doorgaans goedkoper om CTE's te gebruiken in plaats van tijdelijke tabellen te maken.
Afgeleide tabellen in query's , gesorteerd op hun typische algemene prestaties (uitzonderingen voor speciale gevallen met indexen). Van langzaam naar snel:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
zou proberen dubbele rijen te vouwen. Meestal willen mensen echt UNION ALL
, die alleen rijen toevoegt. Sneller en probeert geen dupes te verwijderen.