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;
Những điểm chính
-
hànglà một từ dành riêng trong tiêu chuẩn SQL. Nó được phép sử dụng ở Postgres, nhưng nó vẫn không khôn ngoan. Tôi khiến việc thêm vào trước biến psql với dấu gạch dưới_là một điều khó hiểu để tránh bất kỳ xung đột đặt tên nào. -
Bạn không chọn toàn bộ hàng dù sao, chỉ là tên bảng trong ví dụ này. Tốt nhất hãy sử dụng một biến kiểu
regclass, do đó tránh được việc đưa vào SQL bằng cách tự động đặt tên bảng bất hợp pháp. Chi tiết trong câu trả lời có liên quan này:
Tên bảng dưới dạng tham số hàm PostgreSQL -
Bạn không cần
LIMITtrong mộtEXISTSbiểu thức, chỉ kiểm tra sự tồn tại của bất kỳ hàng. Và bạn không cần các cột mục tiêu có ý nghĩa vì lý do tương tự. Chỉ cần viếtCHỌN 1 hoặc.SELECT *hoặc cái gì đó -
Bạn cần SQL động cho các truy vấn có số nhận dạng thay đổi. SQL thuần không cho phép điều đó. Tức là:xây dựng một chuỗi truy vấn và
THỰC HIỆNnó. Chi tiết trong câu trả lời có liên quan chặt chẽ này:
SQL động (THỰC HIỆN) làm điều kiện cho câu lệnh IF -
Điều này cũng đúng với một
DROPnếu bạn muốn chạy nó. Tôi đã thêm một nhận xét.