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 29/05/2012 19:42:03

charleydc5
Membre

Problème très étrange avec une fonction

Bonjour à tous,

J'ai un problème assez étrange avec une fonction et je n'arrive pas à comprendre la cause.

En bref, je j'ai une fonction PL/PGSQL dans laquelle je fais un simple FOR pour construire une chaine de caractères concaténée. À la fin, je veux retourner cette chaine de caractères.

CREATE OR REPLACE FUNCTION mafonction(id integer) RETURNS character varying AS

$BODY$

DECLARE 
	_record RECORD;
	strnoms varchar;

BEGIN
	strnoms := '';

	FOR _record IN 

		... mon select ...
	
	LOOP

		IF (strnoms = '') THEN
			strnoms := strnoms || _record.strnom;
		ELSE
			strnoms := strnoms || ', ' || _record.strnom;
		END IF;
	END LOOP;

	RETURN strnoms;
END

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Pour une raison que j'ignore, lorsque j'exécute ma fonction avec un ID connu, elle fonctionne, mais l'entête de colonne est le nom de ma fonction.

Je reçois donc le résultat suivant :

mafonction
character varying
--------------------------------------
nom1, nom2, nom3, nom4, nom5, etc...

Quelqu'un a une idée??

Ce n'est pas un problème avec pgAdmin, car quand je fais un Preview du résultat de ma requête dans mon outil de conception de rapports (JasperSoft iReport), le nom de mon champs est "mafonction".

Très étrange...

Merci pour votre aide et bonne journée!

Dernière modification par charleydc5 (29/05/2012 19:42:50)


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

Hors ligne

#2 29/05/2012 19:52:25

rjuju
Administrateur

Re : Problème très étrange avec une fonction

Bonjour,
vous pouvez nommer votre champ à l'appel :
select mafonction(1) as le_nom

Hors ligne

#3 29/05/2012 20:12:21

gleu
Administrateur

Re : Problème très étrange avec une fonction

Et ce n'est pas une anomalie, c'est ainsi que ça fonctionne.


Guillaume.

Hors ligne

#4 29/05/2012 20:13:27

charleydc5
Membre

Re : Problème très étrange avec une fonction

D'accord. Je croyais qu'on pouvait nommer l'expression de retour comme nous pouvions le faire dans MS SQL..

Merci pour votre aide


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

Hors ligne

#5 29/05/2012 21:10:52

gleu
Administrateur

Re : Problème très étrange avec une fonction

Oui, c'est possible. C'est ce dont rjuju parlait.


Guillaume.

Hors ligne

#6 29/05/2012 21:33:25

fstreboot
Membre

Re : Problème très étrange avec une fonction

Bonjour,

J'ai déjà rencontré le même problème mais en utilisant une avenue différente. Je m'explique :

Je désire créer une fonction qui me retourne un seul nombre, soit le nombre de participants. J'ai déclaré ma fonction de la manière suivante :

CREATE OR REPLACE FUNCTION maFonction(intSondageid integer)
  [b]RETURNS SETOF bigint AS [b]
$BODY$
                 SELECT COUNT(intId) AS nombreParticipants FROM Participant
	WHERE intSondageId = $
1$BODY$

Quand j'appelle ensuite ma fonction par select * from maFonction(2), il me retourne le résultat avec le nom de ma fonction, ce qu'il ne faut pas...

J'ai tenté de créer ma fonction avec plutôt l'entête suivante :

CREATE OR REPLACE FUNCTION maFonction(intSondageid integer)
  RETURNS TABLE(nombreParticipants bigint) AS

Et quand j'appelle ensuite ma fonction par select * from maFonction(2), cette fois-ci il me retourne le résultat avec le nom nombreParticipants, comme je le désire et non pas avec le nom de la fonction.


Pourtant, après avoir créé la fonction, pgAdmin m'affiche dans le SQL pane la fonction avec un RETURNS SETOF et ce même si je l'ai créée avec l'appellation RETURNS TABLE


Autre point, dans le cas où je la crée en écrivant RETURNS TABLE(), le SQL pane m'affiche IN à gauche de mon paramètre d'entrée :
CREATE OR REPLACE FUNCTION maFonction(IN intSondageid integer)
  RETURNS SETOF bigint AS


alors qu'il ne le fait pas dans le cas où je la crée en écrivant RETURNS SETOF.


Ma question est donc : est-ce un bug d'interprétation de code par Postgres ou bien il y a une configuration particulière à faire dans pgAdmin ou sur le serveur pour éviter cette confusion ?

en espérant avoir été suffisamment clair.
Merci !

Hors ligne

#7 29/05/2012 22:41:03

rjuju
Administrateur

Re : Problème très étrange avec une fonction

Je pense que pgAdmin génère le script de création de la fonction par rapport au catalogue système (pg_proc) et ne prend pas en compte le nom des paramètres en sortie au moins dans ce cas là.
Si vous faites

select proargnames[2],proargmodes[2]
from pg_proc
where proname ilike 'mafonction'

avez-vous le nom de votre paramètre et le type 't' (pour out) ?

Hors ligne

#8 30/05/2012 00:05:12

gleu
Administrateur

Re : Problème très étrange avec une fonction

Autre question : Quelle version de pgAdmin avez-vous ?


Guillaume.

Hors ligne

#9 30/05/2012 14:41:59

fstreboot
Membre

Re : Problème très étrange avec une fonction

Bonjour,
J'ai exécuté :

select proargnames[2],proargmodes[2]
from pg_proc
where proname ilike 'mafonction'

comme vous me l'avez conseillé et ça fonctionne dans le cas que j'ai créé ma méthode avec RETURNS TABLE() : le nom de mon paramètre ainsi que le type 't' s'affichent sans problème !

Par contre, ces deux champs sont vides si j'exécute ce select sur la fonction que j'ai créée avec RETURNS SETOF bigint.


Ma version de pgAdmin est 1.12.2

Merci !

Hors ligne

#10 30/05/2012 14:58:13

gleu
Administrateur

Re : Problème très étrange avec une fonction

Par contre, ces deux champs sont vides si j'exécute ce select sur la fonction que j'ai créée avec RETURNS SETOF bigint.

Normal, il n'existe pas d'argument 2 sur cette fonction.

Ma version de pgAdmin est 1.12.2

Mettez à jour et ça ira mieux. La dernière version stable disponible est la 1.14.2. Il est aussi possible de prendre la 1.16 beta.


Guillaume.

Hors ligne

Pied de page des forums