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 14/02/2012 18:44:08

charleydc5
Membre

Création d'une fonction qui retourne plusieurs chaines de caractères

Bonjour à tous,

J'ai codé une fonction afin de retourner une chaine de caractères concaténée, et j'ai toujours un résultat vide alors je voulais vous la montrer à savoir si ce que j'ai fait est correct. La voici :

CREATE OR REPLACE FUNCTION qryListerNoms(intcommerceid integer, intcommercenomactuelid integer)
RETURNS character varying AS

$BODY$

DECLARE 
	_record RECORD;
	strnoms varchar;

BEGIN
	FOR _record IN 
	SELECT * 
	FROM commercenom 
	WHERE 	commercenom.intcommerceid = $1 AND 
		commercenom.intcommercenomid < $2 
	LOOP

		strnoms := strnoms || ', ' || _record.strnom;
	END LOOP;

	RETURN strnoms;

END

$BODY$

LANGUAGE 'plpgsql' VOLATILE
COST 100;

En fait, je veux retourner les anciens noms de commerces, séparés par des virgules, pour un commerce en particulier passé en paramètre (intcommerceid). L'autre paramètre est le ID du nom actuel du commerce (intcommercenomactuelid).

Si je fais un SELECT manuel avec des données réelles, le commerce a bel et bien un historique de nom. Par contre, si j'exécute la fonction dans pgAdmin, j'ai toujours une chaine vide comme résultat.

Avez-vous des idées ou des recommandations?

Merci


Charles Morin
PostgreSQL 9.0.3 sur Windows 2008 Server Standard (x64)

Hors ligne

#2 14/02/2012 19:10:21

rjuju
Administrateur

Re : Création d'une fonction qui retourne plusieurs chaines de caractères

Bonjour.
Il faut initialiser votre variable strnoms à une chaine vide avant votre boucle.
En effet, la concaténation d'une chaîne nulle à une chaîne non nulle est une chaîne nulle.

Vous pouvez également modifier votre requête en utilisant un aggrégat, ce qui simplifiera le problème de la première virgule :

SELECT string_agg(strnom,', ') INTO strnoms FROM commercenom WHERE ....

Dernière modification par rjuju (14/02/2012 19:10:36)

Hors ligne

#3 14/02/2012 19:11:05

arthurr
Membre

Re : Création d'une fonction qui retourne plusieurs chaines de caractères

Bonjour,

strnoms doit être NULL au démarrage de la procédure stockée, et on ne sait pas concaténer des NULL avec une chaine :

postgres=# select NULL || 'toto';
 ?column? 
----------
 
(1 row)

postgres=# select '' || 'toto';
 ?column? 
----------
 toto
(1 row)

Pour corriger votre problème, utilisez COALESCE (http://docs.postgresqlfr.org/9.0/functi … ional.html) ou initialisez strnoms := ''

Hors ligne

#4 23/02/2012 20:22:25

charleydc5
Membre

Re : Création d'une fonction qui retourne plusieurs chaines de caractères

Fonctionnel!

Désolé pour le délais à répondre.

Merci pour votre aide, c'est grandement apprécié.


Charles Morin
PostgreSQL 9.0.3 sur Windows 2008 Server Standard (x64)

Hors ligne

Pied de page des forums