Il messaggio di errore è piuttosto ovvio, non puoi eliminare una tabella temporanea mentre è in uso.
Potresti essere in grado di evitare il problema aggiungendo ON COMMIT DROP
:
Tuttavia, questo può probabilmente essere più semplice. Se non ne hai necessità tutte quelle tabelle temporanee per cominciare (cosa che sospetto), puoi sostituirle tutte con CTE (o la maggior parte di esse probabilmente anche con sottoquery più economiche) e semplificare in una grande query. Può essere plpgsql o solo 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;
Le visualizzazioni memorizzano solo una query ("la ricetta"), non i valori risultanti effettivi ("la zuppa").
In genere è più economico utilizzare CTE invece di creare tabelle temporanee.
Tabelle derivate nelle query , ordinati in base alla loro performance complessiva tipica (eccezioni per casi speciali relativi agli indici). Da lento a veloce:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
proverebbe a piegare le righe duplicate. In genere, le persone vogliono davvero UNION ALL
, che aggiunge solo righe. Più veloce e non tenta di rimuovere i duplicati.