El mensaje de error es bastante obvio, no puede eliminar una tabla temporal mientras se está utilizando.
Es posible que pueda evitar el problema agregando ON COMMIT DROP
:
Sin embargo, esto probablemente puede ser más simple. Si no necesita todas esas tablas temporales para empezar (que sospecho), puede reemplazarlas todas con CTE (o la mayoría de ellas probablemente incluso con subconsultas más baratas) y simplificarlas a una gran consulta. Puede ser plpgsql o simplemente 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;
Las vistas solo almacenan una consulta ("la receta"), no los valores reales resultantes ("la sopa").
Por lo general, es más económico usar CTE en lugar de crear tablas temporales.
Tablas derivadas en consultas , ordenados por su desempeño general típico (excepciones para casos especiales que involucran índices). De lento a rápido:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
intentaría doblar filas duplicadas. Por lo general, la gente realmente quiere UNION ALL
, que solo agrega filas. Más rápido y no intenta eliminar duplicados.