PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 18/03/2013 22:09:06

damalaan
Membre

RESOLU - récupération résultat requête dans une variable

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

#2 18/03/2013 22:41:39

rjuju
Administrateur

Re : RESOLU - récupération résultat requête dans une variable

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.

Hors ligne

#3 19/03/2013 09:34:59

damalaan
Membre

Re : RESOLU - récupération résultat requête dans une variable

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

#4 19/03/2013 09:53:48

MitsuTomoe
Membre

Re : RESOLU - récupération résultat requête dans une variable

Vous pouvez écrire :

SELECT INTO mavar ana_decimal FROM tbl_analyse_ana WHERE ana_id = crit;

Alex

Hors ligne

#5 19/03/2013 14:30:59

damalaan
Membre

Re : RESOLU - récupération résultat requête dans une variable

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

Pied de page des forums