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àng
là 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
LIMIT
trong mộtEXISTS
biể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ỆN
nó. 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
DROP
nếu bạn muốn chạy nó. Tôi đã thêm một nhận xét.