CREATE OR REPLACE FUNCTION drop_now()
RETURNS void AS
$func$
DECLARE
_tbl regclass;
_found int;
BEGIN
FOR _tbl IN
SELECT relid
FROM pg_stat_user_tables
WHERE schemaname = 'public'
AND relname LIKE '%test%'
LOOP
EXECUTE format($f$SELECT 1 FROM %s
WHERE tm < now() - interval '90 min'$f$, _tbl);
GET DIAGNOSTICS _found = ROW_COUNT;
IF _found > 0 THEN
-- EXECUTE 'DROP TABLE ' || _tbl;
RAISE NOTICE 'Dropped table: %', _tbl;
END IF;
END LOOP;
END
$func$ LANGUAGE plpgsql;
Poin utama
-
row
adalah kata yang dicadangkan dalam standar SQL. Penggunaannya diperbolehkan di Postgres, tetapi masih tidak bijaksana. Saya biasakan untuk menambahkan variabel psql dengan garis bawah_
untuk menghindari konflik penamaan. -
Anda tidak memilih seluruh baris anyway, hanya nama tabel dalam contoh ini. Sebaiknya gunakan variabel tipe
regclass
, sehingga menghindari injeksi SQL melalui nama tabel ilegal secara otomatis. Detail dalam jawaban terkait ini:
Nama tabel sebagai parameter fungsi PostgreSQL -
Anda tidak perlu
LIMIT
dalamEXISTS
ekspresi, yang hanya memeriksa keberadaan apa saja baris. Dan Anda tidak memerlukan kolom target yang berarti untuk alasan yang sama. Cukup tulisSELECT 1
atauSELECT *
atau apalah . -
Anda memerlukan SQL dinamis untuk kueri dengan pengidentifikasi variabel. SQL biasa tidak memungkinkan untuk itu. Yaitu:buat string kueri dan
EXECUTE
dia. Detail dalam jawaban yang terkait erat ini:
SQL Dinamis (EXECUTE) sebagai kondisi untuk pernyataan IF -
Hal yang sama berlaku untuk
DROP
pernyataan, jika Anda ingin menjalankannya. Saya menambahkan komentar.