Renvoi de données à partir d'une requête PostgreSQL SELECT dans une fonction
Ce guide aborde le défi courant consistant à renvoyer les résultats d'une SELECT
requête dans une fonction PostgreSQL. La clé est de comprendre comment définir correctement le type de retour et utiliser la syntaxe appropriée.
La RETURN QUERY
Solution :
La méthode la plus efficace consiste à utiliser la commande RETURN QUERY
. Cela définit clairement les colonnes renvoyées et leurs types de données. Prenons cet exemple :
<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>
Le type de retour de cette fonction est explicitement une table avec les colonnes txt
, cnt
et ratio
. Notez l'utilisation de ::NUMERIC
pour la conversion de type explicite afin de garantir un calcul de rapport précis. L'absence d'une déclaration RETURN
distincte est intentionnelle ; RETURN QUERY
gère la valeur de retour.
Dénomination soignée :
Évitez les conflits de noms entre les paramètres de sortie et les noms de colonnes de requête. L'utilisation de la qualification de table (par exemple, t.txt
) évite toute ambiguïté.
Approche alternative pour le calcul de la part relative :
Pour calculer la part relative de chaque jeton, une alternative utilisant les fonctions de fenêtre offre une efficacité améliorée :
<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>
Cette version utilise SUM(cnt) OVER ()
pour calculer le nombre total sur toutes les lignes, fournissant ainsi un calcul de part relative plus concis.
Remarque importante :
Les instructionsExplicites RETURN
sont inutiles lors de l'utilisation de RETURNS TABLE
ou de paramètres de sortie. Le comportement de retour de la fonction est défini par la clause RETURNS
et la requête elle-même.
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!