Vous n'êtes pas identifié(e).
Pages : 1
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
Bonjour,
vous pouvez nommer votre champ à l'appel :
select mafonction(1) as le_nom
Julien.
https://rjuju.github.io/
En ligne
Et ce n'est pas une anomalie, c'est ainsi que ça fonctionne.
Guillaume.
Hors ligne
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
Oui, c'est possible. C'est ce dont rjuju parlait.
Guillaume.
Hors ligne
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
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) ?
Julien.
https://rjuju.github.io/
En ligne
Autre question : Quelle version de pgAdmin avez-vous ?
Guillaume.
Hors ligne
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
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
Pages : 1