Maison > base de données > tutoriel mysql > Comment renvoyer efficacement des ensembles de résultats dans les fonctions PostgreSQL ?

Comment renvoyer efficacement des ensembles de résultats dans les fonctions PostgreSQL ?

Mary-Kate Olsen
Libérer: 2025-01-17 10:26:14
original
190 Les gens l'ont consulté

How to Efficiently Return Result Sets in PostgreSQL Functions?

Renvoi d'ensembles de résultats dans les fonctions PostgreSQL

Lors de l'écriture de fonctions dans PostgreSQL, il est souvent nécessaire de renvoyer des ensembles de résultats. La fonction fournie, wordFrequency, est correctement définie avec un type de retour SETOF RECORD. Cependant, l'implémentation actuelle ne dispose pas de la commande appropriée pour renvoyer le résultat de la requête.

RETURN QUERY

La solution réside dans l'utilisation de la commande RETURN QUERY, comme démontré dans ce qui suit. fonction corrigée :

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$;
Copier après la connexion

Utilisation de RETURN TABLE

Définir explicitement le type de retour à l'aide de RETURNS TABLE offre plusieurs avantages :

  • Élimine le besoin d'une liste de définitions de colonnes à chaque appel de fonction.
  • Permet de spécifier les types de données des paramètres OUT pour correspondre au retour de la requête valeurs.

Considérations de dénomination

Soyez prudent lorsque vous nommez les paramètres OUT, car ils sont visibles dans tout le corps de la fonction. Pour éviter les conflits ou la confusion, qualifiez entièrement les colonnes du tableau portant le même nom ou suivez les meilleures pratiques de dénomination suggérées.

Alternatives

La requête alternative fournie calcule la part relative par jeton :

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$;
Copier après la connexion

Cette version utilise une fonction de fenêtre et garantit un résultat numérique pour un calcul précis de la part relative.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal