PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Variabel untuk pengidentifikasi di dalam JIKA ADA dalam fungsi 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;

Poin utama

  • row adalah kata yang dicadangkan dalam standar SQL. Penggunaannya diperbolehkan di Postgres, tetapi masih tidak bijaksana. Saya biasakan untuk menambahkan variabel psql dengan garis bawah _ untuk menghindari konflik penamaan.

  • Anda tidak memilih seluruh baris anyway, hanya nama tabel dalam contoh ini. Sebaiknya gunakan variabel tipe regclass , sehingga menghindari injeksi SQL melalui nama tabel ilegal secara otomatis. Detail dalam jawaban terkait ini:
    Nama tabel sebagai parameter fungsi PostgreSQL

  • Anda tidak perlu LIMIT dalam EXISTS ekspresi, yang hanya memeriksa keberadaan apa saja baris. Dan Anda tidak memerlukan kolom target yang berarti untuk alasan yang sama. Cukup tulis SELECT 1 atau SELECT * atau apalah .

  • Anda memerlukan SQL dinamis untuk kueri dengan pengidentifikasi variabel. SQL biasa tidak memungkinkan untuk itu. Yaitu:buat string kueri dan EXECUTE dia. Detail dalam jawaban yang terkait erat ini:
    SQL Dinamis (EXECUTE) sebagai kondisi untuk pernyataan IF

  • Hal yang sama berlaku untuk DROP pernyataan, jika Anda ingin menjalankannya. Saya menambahkan komentar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Izin dump Postgresql ditolak

  2. Cara Menjeda Eksekusi Pernyataan di PostgreSQL

  3. Postgresql pencarian teks lengkap bagian dari kata-kata

  4. Parameter Nilai Tabel JDBC Postgresql

  5. Bagaimana cara membaca bidang kutipan postgresql dengan npgsql 3.0.0?