Heim > Datenbank > MySQL-Tutorial > Wie kann man Ergebnismengen in PostgreSQL-Funktionen effizient zurückgeben?

Wie kann man Ergebnismengen in PostgreSQL-Funktionen effizient zurückgeben?

Mary-Kate Olsen
Freigeben: 2025-01-17 10:26:14
Original
188 Leute haben es durchsucht

How to Efficiently Return Result Sets in PostgreSQL Functions?

Ergebnismengen in PostgreSQL-Funktionen zurückgeben

Beim Schreiben von Funktionen in PostgreSQL ist es oft notwendig, Ergebnismengen zurückzugeben. Die bereitgestellte Funktion „wordFrequency“ ist korrekt mit dem Rückgabetyp SETOF RECORD definiert. Der aktuellen Implementierung fehlt jedoch der entsprechende Befehl, um das Ergebnis der Abfrage zurückzugeben.

RETURN QUERY

Die Lösung liegt in der Verwendung des RETURN QUERY-Befehls, wie im Folgenden gezeigt korrigierte Funktion:

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$;
Nach dem Login kopieren

Verwendung von RETURN TABLE

Das explizite Definieren des Rückgabetyps mithilfe von RETURNS TABLE bietet mehrere Vorteile:

  • Entfällt die Notwendigkeit einer Spaltendefinitionsliste bei jedem Funktionsaufruf.
  • Ermöglicht die Angabe der Datentypen von OUT-Parametern entsprechend der Rückgabe der Abfrage Werte.

Überlegungen zur Benennung

Seien Sie vorsichtig bei der Benennung von OUT-Parametern, da diese im gesamten Funktionskörper sichtbar sind. Um Konflikte oder Verwirrung zu vermeiden, qualifizieren Sie Tabellenspalten mit demselben Namen entweder vollständig oder befolgen Sie die empfohlenen Best Practices für die Benennung.

Alternativen

Die bereitgestellte alternative Abfrage berechnet den relativen Anteil pro 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$;
Nach dem Login kopieren

Diese Version verwendet eine Fensterfunktion und gewährleistet ein numerisches Ergebnis für einen genauen relativen Anteil Berechnung.

Das obige ist der detaillierte Inhalt vonWie kann man Ergebnismengen in PostgreSQL-Funktionen effizient zurückgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage