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$;
Utilisation de RETURN TABLE
Définir explicitement le type de retour à l'aide de RETURNS TABLE offre plusieurs avantages :
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$;
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!