Pesan kesalahannya cukup jelas, Anda tidak dapat menjatuhkan tabel sementara saat sedang digunakan.
Anda mungkin dapat menghindari masalah dengan menambahkan ON COMMIT DROP
:
Namun, ini mungkin bisa lebih sederhana. Jika Anda tidak membutuhkan semua tabel temp untuk memulai (yang saya curigai), Anda dapat mengganti semuanya dengan CTE (atau sebagian besar dari mereka mungkin bahkan dengan subkueri yang lebih murah) dan menyederhanakannya menjadi satu kueri besar. Bisa plpgsql atau hanya 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;
Tampilan hanya menyimpan kueri ("resep"), bukan nilai yang dihasilkan sebenarnya ("sup").
Biasanya lebih murah menggunakan CTE daripada membuat tabel sementara.
Tabel turunan dalam kueri , diurutkan berdasarkan kinerja keseluruhan yang khas (pengecualian untuk kasus khusus yang melibatkan indeks). Dari lambat ke cepat:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
akan mencoba melipat baris duplikat. Biasanya, orang sangat menginginkan UNION ALL
, yang hanya menambahkan baris. Lebih cepat dan tidak mencoba menghapus penipuan.