Chybová zpráva je poměrně zřejmá, nemůžete zrušit dočasnou tabulku, když je používána.
Problému se můžete vyhnout přidáním ON COMMIT DROP
:
To však může být pravděpodobně jednodušší. Pokud nepotřebujete všechny ty dočasné tabulky pro začátek (což mám podezření), můžete je všechny nahradit CTE (nebo většinu z nich pravděpodobně dokonce levnějšími poddotazy) a zjednodušit na jeden velký dotaz. Může být plpgsql nebo jen 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;
Zobrazení pouze ukládají dotaz („recept“), nikoli skutečné výsledné hodnoty („polévka“).
Obvykle je levnější používat CTE místo vytváření dočasných tabulek.
Odvozené tabulky v dotazech , seřazené podle jejich typického celkového výkonu (výjimky pro speciální případy zahrnující indexy). Od pomalého k rychlému:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
pokusí se skládat duplicitní řádky. Lidé obvykle opravdu chtějí UNION ALL
, který pouze připojuje řádky. Rychlejší a nesnaží se odstranit podvody.