PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Não é possível descartar a tabela temporária na função Postgres:sendo usada por consultas ativas nesta sessão


A mensagem de erro é bastante óbvia, você não pode descartar uma tabela temporária enquanto ela está sendo usada.

Você pode evitar o problema adicionando ON COMMIT DROP :

No entanto, isso provavelmente pode ser mais simples. Se você não precisar todas essas tabelas temporárias para começar (o que eu suspeito), você pode substituí-las todas por CTEs (ou a maioria delas provavelmente até com subconsultas mais baratas) e simplificar para uma grande consulta. Pode ser plpgsql ou apenas 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;

As visualizações estão apenas armazenando uma consulta ("a receita"), não os valores reais resultantes ("a sopa").

Normalmente, é mais barato usar CTEs em vez de criar tabelas temporárias.
Tabelas derivadas em consultas , classificados por seu desempenho geral típico (exceções para casos especiais envolvendo índices). De lento a rápido:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery

UNION tentaria dobrar linhas duplicadas. Normalmente, as pessoas realmente querem UNION ALL , que apenas acrescenta linhas. Mais rápido e não tenta remover dupes.