Memulangkan Data daripada Pertanyaan SELECT PostgreSQL dalam Fungsi
Panduan ini menangani cabaran biasa untuk mengembalikan hasil pertanyaan SELECT
dalam fungsi PostgreSQL. Perkara utama ialah memahami cara mentakrifkan jenis pulangan dengan betul dan menggunakan sintaks yang sesuai.
Penyelesaian RETURN QUERY
:
Kaedah yang paling berkesan ialah menggunakan perintah RETURN QUERY
. Ini dengan jelas mentakrifkan lajur yang dikembalikan dan jenis datanya. Pertimbangkan contoh ini:
<code class="language-sql">CREATE OR REPLACE FUNCTION word_frequency(_max_tokens INT) RETURNS TABLE (txt TEXT, cnt BIGINT, ratio NUMERIC) AS $$ BEGIN RETURN QUERY SELECT t.txt, count(*) AS cnt, (count(*)::NUMERIC * 100) / _max_tokens AS ratio FROM ( SELECT txt FROM token WHERE chartype = 'ALPHABETIC' LIMIT _max_tokens ) t GROUP BY t.txt ORDER BY cnt DESC; END; $$ LANGUAGE plpgsql;</code>
Jenis pemulangan fungsi ini secara eksplisit ialah jadual dengan lajur txt
, cnt
dan ratio
. Perhatikan penggunaan ::NUMERIC
untuk tuangan jenis eksplisit bagi memastikan pengiraan nisbah yang tepat. Ketiadaan pernyataan RETURN
yang berasingan adalah disengajakan; RETURN QUERY
mengendalikan nilai pulangan.
Penamaan Berhati-hati:
Elakkan menamakan konflik antara parameter output dan nama lajur pertanyaan. Menggunakan kelayakan jadual (cth., t.txt
) menghalang kekaburan.
Pendekatan Alternatif untuk Pengiraan Saham Relatif:
Untuk mengira bahagian relatif setiap token, alternatif menggunakan fungsi tetingkap menawarkan kecekapan yang lebih baik:
<code class="language-sql">CREATE OR REPLACE FUNCTION word_frequency(_max_tokens INT) RETURNS TABLE (txt TEXT, abs_cnt BIGINT, relative_share NUMERIC) AS $$ BEGIN RETURN QUERY SELECT txt, cnt, ROUND((cnt::NUMERIC * 100) / SUM(cnt) OVER (), 2) AS relative_share FROM ( SELECT txt, COUNT(*) AS cnt FROM token WHERE chartype = 'ALPHABETIC' GROUP BY txt ORDER BY cnt DESC LIMIT _max_tokens ) t ORDER BY cnt DESC; END; $$ LANGUAGE plpgsql;</code>
Versi ini menggunakan SUM(cnt) OVER ()
untuk mengira jumlah kiraan merentas semua baris, memberikan pengiraan bahagian relatif yang lebih ringkas.
Nota Penting:
Penyataan Eksplisit RETURN
tidak diperlukan apabila menggunakan RETURNS TABLE
atau parameter output. Tingkah laku pemulangan fungsi ditakrifkan oleh klausa RETURNS
dan pertanyaan itu sendiri.
Atas ialah kandungan terperinci Bagaimana untuk Mengembalikan Hasil Pertanyaan SELECT dalam Fungsi PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!