Le message d'erreur est plutôt évident, vous ne pouvez pas supprimer une table temporaire en cours d'utilisation.
Vous pourrez peut-être éviter le problème en ajoutant ON COMMIT DROP
:
Cependant, cela peut probablement être plus simple. Si vous n'avez pas besoin toutes ces tables temporaires pour commencer (ce que je soupçonne), vous pouvez toutes les remplacer par des CTE (ou la plupart d'entre elles probablement même par des sous-requêtes moins chères) et les simplifier en une seule grande requête. Peut être plpgsql ou simplement 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;
Les vues stockent simplement une requête ("la recette"), pas les valeurs réelles résultantes ("la soupe").
Il est généralement moins cher d'utiliser des CTE au lieu de créer des tables temporaires.
Tables dérivées dans les requêtes , triés par leurs performances globales typiques (exceptions pour les cas particuliers impliquant des index). De lent à rapide :
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
essaierait de plier les lignes en double. Généralement, les gens veulent vraiment UNION ALL
, qui ajoute simplement des lignes. Plus rapide et n'essaie pas de supprimer les doublons.