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;
Основни точки
-
ред
е запазена дума в стандарта SQL. Използването му е разрешено в Postgres, но все още е неразумно. Създавам си навик да добавям пред psql променливата долна черта_
за да избегнете всякакви конфликти при именуване. -
Не избирате целия ред така или иначе, само името на таблицата в този пример. Най-добре използвайте променлива от тип
regclass
, като по този начин се избягва автоматично SQL инжектиране чрез незаконни имена на таблици. Подробности в този свързан отговор:
Име на таблица като параметър на функция на PostgreSQL -
Нямате нужда от
LIMIT
вСЪЩЕСТВУВАЩИ
израз, който проверява само за съществуването на any редове. И нямате нужда от смислени целеви колони по същата причина. Просто напишетеИЗБЕРЕТЕ 1код> или
.SELECT *
или нещо подобно -
Имате нужда от динамичен SQL за заявки с идентификатори на променливи. Обикновеният SQL не позволява това. Т.е.:създайте низ за заявка и
EXECUTE
то. Подробности в този тясно свързан отговор:
Динамичен SQL (EXECUTE) като условие за оператор IF -
Същото важи и за
DROP
израз, ако искате да го изпълните. Добавих коментар.