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" ):