sql >> Databáze >  >> RDS >> PostgreSQL

Proměnné pro identifikátory uvnitř IF EXISTS ve funkci plpgsql

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 v EXISTUJE výraz, který pouze kontroluje existenci jakéhokoli řádky. A ze stejného důvodu nepotřebujete smysluplné cílové sloupce. Stačí napsat VYBRAT 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ář.



  1. Rozlišování malých a velkých písmen v MySQL

  2. Nelze se připojit k serveru MySQL, chyba 111

  3. Jak obejít jedinečné porušení omezení?

  4. Python MySQLdb – Chyba 1045:Uživateli byl odepřen přístup