Die Fehlermeldung ist ziemlich offensichtlich, Sie können eine temporäre Tabelle nicht löschen, während sie verwendet wird.
Möglicherweise können Sie das Problem vermeiden, indem Sie ON COMMIT DROP
hinzufügen :
Dies kann jedoch wahrscheinlich einfacher sein. Wenn Sie es nicht brauchen All diese temporären Tabellen zu Beginn (was ich vermute) können Sie alle durch CTEs (oder die meisten von ihnen wahrscheinlich sogar durch billigere Unterabfragen) ersetzen und zu einer großen Abfrage vereinfachen. Kann plpgsql oder nur SQL sein:
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;
Ansichten speichern nur eine Abfrage ("das Rezept"), nicht die tatsächlich resultierenden Werte ("die Suppe").
In der Regel ist es günstiger, CTEs zu verwenden, anstatt temporäre Tabellen zu erstellen.
Abgeleitete Tabellen in Abfragen , sortiert nach ihrer typischen Gesamtperformance (Ausnahmen für Sonderfälle bei Indizes). Von langsam zu schnell:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
würde versuchen, doppelte Reihen zu falten. Normalerweise wollen die Leute wirklich UNION ALL
, die nur Zeilen anhängt. Schneller und versucht nicht, Duplikate zu entfernen.