Dalam senario anda, jenis pemulangan akan berubah disebabkan oleh nama dan jenis lajur yang berbeza. Untuk mengendalikan ini, anda boleh memanfaatkan keupayaan PostgreSQL untuk mengembalikan jenis rekod tanpa nama:
<code class="language-sql">CREATE FUNCTION data_of(integer) RETURNS SETOF record AS ...</code>
Walau bagaimanapun, pendekatan ini memerlukan penetapan takrif lajur secara manual dalam setiap panggilan fungsi:
<code class="language-sql">SELECT * FROM data_of(17) AS foo (colum_name1 integer , colum_name2 text , colum_name3 real);</code>
Untuk mengelakkan pendekatan yang membosankan ini, anda boleh menggunakan jenis data dokumen seperti JSON atau XML untuk menyimpan data tidak berstruktur:
<code class="language-sql">CREATE FUNCTION data_of(integer) RETURNS JSONB AS ...</code>
Walau bagaimanapun, pendekatan ini akan mengorbankan kelebihan jenis data berstruktur PostgreSQL.
Jika struktur data anda konsisten (kecuali nama lajur), anda boleh mengembalikan nombor tetap lajur yang dinamakan dan ditaip dengan betul:
<code class="language-sql">CREATE FUNCTION data_of(_id integer) RETURNS TABLE (datahora timestamp, col2 text, col3 text) AS $func$ ...</code>
Untuk kesederhanaan, setiap lajur ditukar secara eksplisit kepada jenis TEKS.
Jika anda mempunyai bilangan lajur yang berubah-ubah daripada jenis yang sama, anda boleh menggunakan tatasusunan untuk menyimpan nilai:
<code class="language-sql">CREATE FUNCTION data_of(_id integer) RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS $func$ ...</code>
Selain itu, anda boleh mengembalikan nama lajur sebagai tatasusunan:
<code class="language-sql">CREATE FUNCTION data_of(_id integer) RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS $func$ ...</code>
Untuk mengembalikan semua lajur jadual, tanpa mengira strukturnya, anda boleh menggunakan anyelement
jenis data pseudo:
<code class="language-sql">CREATE FUNCTION data_of(_tbl_type anyelement, _id int) RETURNS SETOF anyelement AS $func$ BEGIN RETURN QUERY EXECUTE format(' SELECT * FROM %s -- pg_typeof returns regtype, quoted automatically WHERE id = ORDER BY datahora' , pg_typeof(_tbl_type)) USING _id; END $func$;</code>
Panggil fungsi ini dengan NULL jenis jadual yang diingini untuk menentukan jenis pulangan secara dinamik:
<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);</code>
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Jenis Pengembalian SQL Dinamik dalam PostgreSQL dengan Nama dan Jenis Lajur yang Bervariasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!