PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Impossible de supprimer la table temporaire dans la fonction Postgres :utilisée par les requêtes actives dans cette session

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.