PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Променливи за идентификатори в IF EXISTS във функция 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;

Основни точки

  • ред е запазена дума в стандарта SQL. Използването му е разрешено в Postgres, но все още е неразумно. Създавам си навик да добавям пред psql променливата долна черта _ за да избегнете всякакви конфликти при именуване.

  • Не избирате целия ред така или иначе, само името на таблицата в този пример. Най-добре използвайте променлива от тип regclass , като по този начин се избягва автоматично SQL инжектиране чрез незаконни имена на таблици. Подробности в този свързан отговор:
    Име на таблица като параметър на функция на PostgreSQL

  • Нямате нужда от LIMIT в СЪЩЕСТВУВАЩИ израз, който проверява само за съществуването на any редове. И нямате нужда от смислени целеви колони по същата причина. Просто напишете ИЗБЕРЕТЕ 1 или SELECT * или нещо подобно .

  • Имате нужда от динамичен SQL за заявки с идентификатори на променливи. Обикновеният SQL не позволява това. Т.е.:създайте низ за заявка и EXECUTE то. Подробности в този тясно свързан отговор:
    Динамичен SQL (EXECUTE) като условие за оператор IF

  • Същото важи и за DROP израз, ако искате да го изпълните. Добавих коментар.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извикване на дефинирана от потребителя функция, намираща се в postgres.c в postgreSQL, използвайки GUI, дефиниран от netbeans

  2. Получаване на всички сгради в обхват от 5 мили от определени координати

  3. Някои идеи за обединяване на ресурси на ниско ниво в PostgreSQL

  4. Как да прехвърлите данни от AWS Postgres RDS към S3 (след това Redshift)?

  5. ActiveRecord се опитва да се свърже с грешната база данни с помощта на rbenv