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

Tetapkan secara dinamis jenis baris yang dikembalikan berdasarkan tabel yang diberikan di plpgsql?

Jika "berdasarkan tabel yang diketahui" yang Anda maksud adalah "persis seperti tabel yang diketahui", maka ya .

SQL adalah bahasa yang diketik secara ketat dan fungsi harus dibuat dengan tipe pengembalian yang terdefinisi dengan baik. Anda dapat kembali ke catatan anonim seperti yang Anda lakukan (dengan RETURNS SETOF record ), tetapi kemudian Anda diminta untuk menambahkan daftar definisi kolom untuk setiap panggilan, seperti pesan kesalahan yang memberitahu Anda. Sesuatu seperti:

SELECT *
FROM   my_function('foo') AS foo (
          colum_name1 integer  -- name and data type for every column
        , colum_name2 text
        , colum_name3 real);

Dan ini hampir tidak dinamis.

Pertanyaan Anda menyisakan ruang untuk interpretasi, tetapi "berdasarkan tabel yang diketahui" akan menunjukkan bahwa fungsi polimorfik mungkin melakukan trik. Jenis kembalian dapat didasarkan pada setiap jenis baris terdaftar secara dinamis, dan ada satu untuk setiap tabel dalam sistem secara otomatis. Contoh kode barebone:

CREATE OR REPLACE FUNCTION my_function(_rowtype anyelement)
  RETURNS SETOF anyelement AS
$func$
BEGIN
   RETURN QUERY EXECUTE format(
     'SELECT * FROM %s LIMIT 10'
    , pg_typeof(_rowtype)  -- pg_typeof() returns regtype, quoted where necessary
      );
END
$func$ LANGUAGE plpgsql;

Telepon:

SELECT * FROM my_function(NULL::my_table);

Instruksi terperinci dalam jawaban terkait ini (lihat bab terakhir "Berbagai jenis tabel lengkap" ):




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya (atau dapatkah saya) SELECT DISTINCT pada beberapa kolom?

  2. Bagaimana cara mempertahankan data menggunakan gambar buruh pelabuhan postgres?

  3. PostgreSQL:Bagaimana cara mengetahui angka yang hilang dalam kolom menggunakan generate_series()?

  4. Cara Membuat Pengguna Dengan Hak Istimewa Superuser di PostgreSQL

  5. Hibernate menghasilkan dua Id urutan yang berbeda untuk sisipan PostgreSQL