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;
Hlavní body
-
řádek
je rezervované slovo ve standardu SQL. Jeho použití je v Postgresu povoleno, ale stále je to nerozumné. Je zvykem přidávat proměnnou psql před podtržítko_
abyste se vyhnuli konfliktům v názvech. -
Nevyberete celý řádek každopádně pouze název tabulky v tomto příkladu. Nejlepší je použít proměnnou typu
regclass
, čímž se automaticky zabrání vkládání SQL prostřednictvím nelegálních názvů tabulek. Podrobnosti v této související odpovědi:
Název tabulky jako parametr funkce PostgreSQL -
Nepotřebujete
LIMIT
vEXISTUJE
výraz, který pouze kontroluje existenci jakéhokoli řádky. A ze stejného důvodu nepotřebujete smysluplné cílové sloupce. Stačí napsatVYBRAT 1 nebo
.SELECT *
nebo něco -
Potřebujete dynamické SQL pro dotazy s proměnnými identifikátory. Prostý SQL to neumožňuje. Tj.:vytvořte řetězec dotazu a
EXECUTE
to. Podrobnosti v této úzce související odpovědi:
Dynamické SQL (EXECUTE) jako podmínka pro příkaz IF -
Totéž platí pro
DROP
příkaz, pokud jej chcete spustit. Přidal jsem komentář.