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

fungsi plpgsql:Mengembalikan baris dari tampilan yang dibuat dari tabel acak

Ini bisa bekerja seperti ini:

CREATE OR REPLACE FUNCTION tt_query(orig_name regclass, data_tt timestamp)
  RETURNS SETOF record AS
$func$
BEGIN

EXECUTE 'CREATE OR REPLACE TEMP VIEW tmp as 
select * 
from  '
|| orig_name 
|| ' where trigger_changed >'
|| quote_literal(data_tt)
|| ' ORDER BY trigger_changed DESC';

-- other work on view tmp

-- return the rows of view temp
RETURN QUERY
SELECT * FROM tmp;

END
$func$  LANGUAGE plpgsql;
  • Perhatikan penggunaan jenis pengenal objek regclass untuk menghindari injeksi SQL secara otomatis.

  • Jangan gunakan sintaks lama var ALIAS for $1 jika Anda tidak perlu. Deklarasikan nama parameter sebagai gantinya.

  • Saya tidak akan menggunakan kata kunci temp sebagai pengidentifikasi, bahkan jika itu diizinkan. Menggunakan tmp sebagai gantinya.

  • Gunakan RETURN QUERY untuk mengembalikan satu set catatan. Ini bahkan bisa menjadi panggilan statis tanpa EXECUTE . Namun, Anda mengembalikan catatan anonim dan Postgres menuntut daftar definisi kolom dengan setiap panggilan:

SELECT * FROM tt_query('tbl_name', '2014-02-15 12:00')
AS f(col1 int, col2 text, ...);

Ini agak berat.

Solusi yang lebih baik

Jika Anda tahu tipe pengembalian (bahkan jika nama tabel berubah, daftar kolom mungkin memiliki tipe yang sama), nyatakan pada waktu pembuatan. Pertimbangkan pertanyaan terkait ini:
PostgreSQL:ERROR:42601:daftar definisi kolom diperlukan untuk fungsi yang mengembalikan "record"

Jika jenis pengembalian bervariasi dengan nama tabel yang disediakan, masih ada solusi yang jauh lebih baik. Karena Anda membuat tampilan dengan SELECT * FROM tbl , Anda dapat menggunakan jenis tabel yang terkenal itu sendiri sebagai polimorfik parameter:

CREATE OR REPLACE FUNCTION tt_query(orig_name anyelement, data_tt timestamp)
  RETURNS SETOF anyelement AS
$func$
BEGIN

EXECUTE format('CREATE OR REPLACE TEMP VIEW tmp AS
   SELECT * FROM  %s
   WHERE  trigger_changed > %L
   ORDER  BY trigger_changed DESC'
  ,pg_typeof(orig_name)
  ,data_tt);

-- other work on view tmp

-- return the rows of view tmp
RETURN QUERY
SELECT * FROM tmp;

END
$func$  LANGUAGE plpgsql;

Panggilan Sederhana:

SELECT * FROM tt_query(NULL::tbl_name, '2014-02-15 12:00');

Juga menggunakan format() untuk penggabungan string yang aman &sederhana.

Detail lebih lanjut dalam jawaban terkait ini:
Memfaktorkan ulang fungsi PL/pgSQL untuk mengembalikan output dari berbagai kueri SELECT




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Meminta array objek JSON di Postgres

  2. Postgres:Pesan berdasarkan kolom string dengan nilai yang diketahui

  3. Bergabunglah dengan dua tabel menggunakan id dan turunan dari tabel seperti pohon

  4. Dua kolom dalam subquery di mana klausa

  5. Mengekspor kueri PostgreSQL ke file csv menggunakan Python