Vous n'êtes pas identifié(e).
Bonjour,
en lien avec mon post http://forums.postgresql.fr/viewtopic.php?id=2548, j'ai fait une fonction pl/pgsql pour :
-en fonction de ana_id récupérer ana_decimal (le nombre de decimale dont j'ai besoin)
-arrondir le nombre passer en paramètre avec le nombre de decimale
CREATE OR REPLACE FUNCTION arrondi(NUMERIC, INTEGER)
RETURNS NUMERIC AS
$$
DECLARE
s RECORD;
crit INTEGER := $2;
nb INTEGER;
cur CURSOR FOR SELECT ana_decimal FROM tbl_analyse_ana WHERE ana_id = crit;
BEGIN
OPEN cur;
LOOP
FETCH NEXT FROM cur INTO s;
EXIT WHEN NOT FOUND;
nb := s.ana_decimal;
END LOOP;
CLOSE cur;
RETURN round($1, nb);
END
$$
LANGUAGE PLPGSQL VOLATILE;
contenu de tbl_analyse_ana
ana_id ana_decimal
1 2
2 0
3 1
exemple de fonctionnement
select arrondi(12.1234, 1) ==>12.12
select arrondi(12.1234, 2)==>12
ma question est : n'y a t il pas plus simple !?
merci
Dernière modification par damalaan (19/03/2013 14:31:21)
Hors ligne
Bonjour,
comme dit dans l'autre message vous pouvez utiliser CASE WHEN. Cela parait cependant étrange d'utiliser potentiellement des arrondi différents dans un même calcul.
Julien.
https://rjuju.github.io/
Hors ligne
L'utilisation de CASE WHEN me parait fastidieuse (ça va me faire des CASE WHEN à rallonge s'il faut que je traite tous les cas ).
Pour ce qui est du caractère étrange : chaque analyse est exprimée dans une unité spécifique avec un nombre de décimale....spécifique (exigence normative!). Je pourrais faire un champ par analyse, mais en terme de modélisation, c'est complètement foireux!
La requête telle qu'elle est faite ne renvoie qu'un seul résultat, ma question était donc de savoir s'il existe un moyen plus simple de mettre de résultat dans une variable directement du genre :
mavar := SELECT ana_decimal FROM tbl_analyse_ana WHERE ana_id = crit
plutôt que de passer par un curseur, sachant que toute façon il n'y aura qu'une ligne à parcourir.
Hors ligne
Vous pouvez écrire :
SELECT INTO mavar ana_decimal FROM tbl_analyse_ana WHERE ana_id = crit;
Alex
Hors ligne
C'est effectivement plus simple!
Voici donc la fonction finale
CREATE OR REPLACE FUNCTION arrondi(NUMERIC, INTEGER)
RETURNS NUMERIC as
$$
DECLARE
nb INTEGER;
BEGIN
SELECT INTO nb ana_decimal FROM tbl_analyse_ana WHERE ana_id = $2;
RETURN ROUND($1, nb);
END;
$$
LANGUAGE plpgsql VOLATILE
Hors ligne