Съобщението за грешка е доста очевидно, не можете да изтриете временна таблица, докато се използва.
Може да успеете да избегнете проблема, като добавите ON COMMIT DROP
:
Това обаче вероятно може да бъде по-просто. Ако не имате нужда всички тези временни таблици като начало (което подозирам), можете да ги замените всички с CTE (или повечето от тях вероятно дори с по-евтини подзаявки) и да опростите до една голяма заявка. Може да бъде plpgsql или просто 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;
Изгледите просто съхраняват заявка („рецептата“), а не действителните получени стойности („супата“).
Обикновено е по-евтино да се използват CTE вместо създаване на временни таблици.
Изведени таблици в заявки , сортирани по тяхната типична обща производителност (изключения за специални случаи, включващи индекси). От бавно към бързо:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
ще се опита да сгъне дублиращи се редове. Обикновено хората наистина искат UNION ALL
, който просто добавя редове. По-бързо и не се опитва да премахне дупки.