sql >> Base de Datos >  >> RDS >> PostgreSQL

No se puede eliminar la tabla temporal en la función de Postgres:está siendo utilizada por consultas activas en esta sesión

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.