Komunikat o błędzie jest dość oczywisty, nie można usunąć tabeli tymczasowej, gdy jest używana.
Możesz uniknąć problemu, dodając ON COMMIT DROP
:
Jednak prawdopodobnie może to być prostsze. Jeśli nie potrzebujesz wszystkie te tabele tymczasowe (co podejrzewam), możesz zastąpić je wszystkie CTE (lub większość z nich prawdopodobnie nawet tańszymi podzapytaniami) i uprościć do jednego dużego zapytania. Może być plpgsql lub po prostu 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;
Widoki przechowują tylko zapytanie („przepis”), a nie rzeczywiste wartości wynikowe („zupa”).
Zwykle taniej jest używać CTE zamiast tworzyć tabele tymczasowe.
Tabele pochodne w zapytaniach , posortowane według ich typowej ogólnej wydajności (wyjątki dla szczególnych przypadków dotyczących indeksów). Od wolnego do szybkiego:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
spróbuje złożyć zduplikowane wiersze. Zazwyczaj ludzie naprawdę chcą UNION ALL
, który po prostu dołącza wiersze. Szybciej i nie próbuje usuwać duplikatów.