Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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)
Julien.
https://rjuju.github.io/
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