Mengembalikan rekod jenis yang tidak ditentukan
Fungsi asal mengisytiharkan jenis teks pemulangan, tetapi kini matlamatnya adalah untuk melaksanakan pernyataan SQL yang dijana dan mengembalikan hasilnya sebagai rekod. Untuk melakukan ini, anda perlu menggunakan SQL dinamik dan menangani rekod pengembalian jenis yang belum ditentukan.
Jenis tersuai dengan kebolehubah jenis angka dan data
Satu pendekatan adalah untuk mencipta jenis pulangan tersuai dengan bilangan lajur tetap tetapi jenis data berubah-ubah. Walau bagaimanapun, ini memerlukan penentuan senarai definisi lajur untuk setiap panggilan, yang menjadi tidak praktikal apabila nama lajur dan jenis data tidak diketahui terlebih dahulu.
Gunakan jenis polimorfik
pg_typeof() Mengembalikan nama jadual sebagai jenis pengecam objek (jenis reg). Apabila ditukar secara automatik kepada teks, pengecam secara automatik disebut dua kali dan memenuhi syarat corak, sekali gus menghalang suntikan SQL.
LAKSANAKAN SOALAN KEMBALI
Cara pilihan untuk melaksanakan SQL dinamik dan mengembalikan baris ialah RETURN QUERY EXECUTE. Ia membolehkan anda melaksanakan pertanyaan SQL dan mengembalikan hasil sebagai set baris dengan jenis baris yang jelas.
Contoh Kod
Andaikan anda ingin mengembalikan semua lajur mana-mana jadual berdasarkan parameter jenis jadual:
<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_tbl_type anyelement, _id int) RETURNS SETOF anyelement LANGUAGE plpgsql AS $func$ BEGIN RETURN QUERY EXECUTE format(' SELECT * FROM %s -- 自动用双引号括起来并进行模式限定 WHERE id = ORDER BY datahora' , pg_typeof(_tbl_type)) USING _id; END $func$;</code>
Penggunaan
Panggil fungsi ini dengan jenis jadual sebagai parameter pertama dan ID sebagai parameter kedua. Fungsi ini akan mengembalikan semua lajur rekod dengan ID yang diberikan dalam jadual yang ditentukan.
<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17); -- 将pcdmet替换为任何其他表名。</code>
Atas ialah kandungan terperinci Bagaimanakah Fungsi PL/pgSQL Dapat Mengembalikan Hasil Secara Dinamik daripada Pelbagai Pertanyaan SELECT?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!