Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mengembalikan Set Hasil dengan Cekap dalam Fungsi PostgreSQL?

Bagaimana untuk Mengembalikan Set Hasil dengan Cekap dalam Fungsi PostgreSQL?

Mary-Kate Olsen
Lepaskan: 2025-01-17 10:26:14
asal
190 orang telah melayarinya

How to Efficiently Return Result Sets in PostgreSQL Functions?

Mengembalikan Set Hasil dalam Fungsi PostgreSQL

Apabila menulis fungsi dalam PostgreSQL, selalunya perlu mengembalikan set hasil. Fungsi yang disediakan, wordFrequency, ditakrifkan dengan betul dengan jenis pemulangan SETOF RECORD. Walau bagaimanapun, pelaksanaan semasa tidak mempunyai arahan yang sesuai untuk mengembalikan hasil pertanyaan.

RETURN QUERY

Penyelesaian terletak pada menggunakan perintah RETURN QUERY, seperti yang ditunjukkan dalam yang berikut fungsi diperbetulkan:

CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int)
  RETURNS TABLE (txt   text   -- also visible as OUT param in function body
               , cnt   bigint
               , ratio bigint)
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY
   SELECT t.txt
        , count(*) AS cnt                 -- column alias only visible in this query
        , (count(*) * 100) / _max_tokens  -- I added parentheses
   FROM  (
      SELECT t.txt
      FROM   token t
      WHERE  t.chartype = 'ALPHABETIC'
      LIMIT  _max_tokens
      ) t
   GROUP  BY t.txt
   ORDER  BY cnt DESC;                    -- potential ambiguity 
END
$func$;
Salin selepas log masuk

Menggunakan RETURN JADUAL

Mentakrifkan jenis pulangan secara eksplisit menggunakan RETURNS TABLE menawarkan beberapa kelebihan:

  • Menghapuskan keperluan untuk senarai definisi lajur dengan setiap panggilan fungsi.
  • Membolehkan menentukan jenis data parameter OUT untuk memadankan pulangan pertanyaan nilai.

Pertimbangan Penamaan

Berhati-hati apabila menamakan parameter OUT, kerana ia boleh dilihat di seluruh badan fungsi. Untuk mengelakkan konflik atau kekeliruan, sama ada melayakkan sepenuhnya lajur jadual dengan nama yang sama atau ikut amalan terbaik penamaan yang disyorkan.

Alternatif

Pertanyaan alternatif yang disediakan mengira bahagian relatif setiap token:

CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int)
  RETURNS TABLE (txt            text
               , abs_cnt        bigint
               , relative_share numeric)
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY
   SELECT t.txt, t.cnt
        , round((t.cnt * 100) / (sum(t.cnt) OVER ()), 2)  -- AS relative_share
   FROM  (
      SELECT t.txt, count(*) AS cnt
      FROM   token t
      WHERE  t.chartype = 'ALPHABETIC'
      GROUP  BY t.txt
      ORDER  BY cnt DESC
      LIMIT  _max_tokens
      ) t
   ORDER  BY t.cnt DESC;
END
$func$;
Salin selepas log masuk

Versi ini menggunakan fungsi tetingkap dan memastikan hasil numerik untuk bahagian relatif yang tepat pengiraan.

Atas ialah kandungan terperinci Bagaimana untuk Mengembalikan Set Hasil dengan Cekap dalam Fungsi PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan