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
-
rowadalah 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
LIMITdalamEXISTSekspresi, yang hanya memeriksa keberadaan apa saja baris. Dan Anda tidak memerlukan kolom target yang berarti untuk alasan yang sama. Cukup tulisSELECT 1atauSELECT *atau apalah . -
Anda memerlukan SQL dinamis untuk kueri dengan pengidentifikasi variabel. SQL biasa tidak memungkinkan untuk itu. Yaitu:buat string kueri dan
EXECUTEdia. Detail dalam jawaban yang terkait erat ini:
SQL Dinamis (EXECUTE) sebagai kondisi untuk pernyataan IF -
Hal yang sama berlaku untuk
DROPpernyataan, jika Anda ingin menjalankannya. Saya menambahkan komentar.