|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre éclairé
![]() |
Bonjour.
Pour simplifier mon probleme, disons que je tente de créer une fonction qui fasse une requette et me retourne le resultat. (evidemment c'est plus compliqué que ca en vrai) En me basant sur les docs trouvées, ma fonction retourne un record. Mais ca ne me va pas du tout, car ce qui m'est retourné n'a qu'une seule colonne contenant le record, du coup, mon client derriere ne sait pas lire le resultat. Or moi je voudrais récupérer les lignes de mon tableau intégralement !!! Je suis programmeur, pas DBA Lorsque j'appelle ma fonction, je voudrais que ce soit comme ci je faisais cette requette (XXX etant la valeur de mon argument) : Code :
SELECT * FROM employe WHERE employe.id = XXX; Code :
Un grand merci d'avance. |
||
|
|
00
|
|
|
#2 | ||
|
Membre éclairé
![]() |
J'ai fini par hasard, à tomber sur la réponse :
Ceci me retournera bien le meme type que si je faisais un simple select : Code :
|
||
|
|
00
|
|
|
#3 |
|
Membre éclairé
![]() |
Anciennement flaggé "resolu" je réouvre le dossier car la méthode employé pose un nouveau probleme.
Si la requette ne trouve pas de résultat, ma fonction ne retourne pas un resultat "null" mais une ligne vide ! Exemple avec un userid qui ne mene nullepart : Code :
SELECT count(*) FROM "GetEmploye"(123) En somme ce que j'aimerai, c'est que ma fonctionne simule rigoureusement le comportement d'une requette. J'ai du mal a comprendre pourquoi les choses se compliquent de la sorte... J'ai biensur modifié ma fonction pour qu'elle retourne un null si elle ne trouve pas de résultat, mais ca ne change rien au probleme. Comment faire SVP ? |
|
|
00
|
|
|
#4 | ||
|
Membre confirmé
![]() Inscription : janvier 2006 Messages : 227 ![]() |
bonjour,
peut-être en rajoutant une condition Code :
|
||
|
|
00
|
|
|
#5 | ||
|
Expert Confirmé
![]() Inscription : septembre 2006 Messages : 2 291 ![]() |
Après un SELECT, NOT FOUND sera vrai s'il n'y a pas de résultat, donc
Code :
|
||
|
|
00
|
|
|
#6 | |||
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Citation:
Mais le plus simple ici serait d'utiliser RETURN QUERY qui est pile fait pour ça: Code :
RETURN QUERY SELECT * FROM employe WHERE employe.id =userid; Code :
|
|||
|
|
00
|
|
|
#7 |
|
Membre éclairé
![]() |
Merci beaucoup pour vos réponses.
estofilo vous venez de me donner une excelente réponse, explicative et claire. @JeitEmgie> j'avais biensur essayé ta méthode, mais ca ne marchait pas, il me retournait quand meme une ligne vide, sans doute à cause du type de sortie de ma fonction. @xavier-Pierre> impossible, la fonction DOIT retourner quelque chose, sinon ca plante à l'execution, c'est ainsi... Ma fonction ne fait pas une simple requette, elle en fait plusieurs, et en fonction des résultats authorise ou non la requette finale qui sera retournée. Je n'ai d'ailleur pas encore tout à fait compris l'interret d'une fonction SQL, j'imagine pour une question de droits que je maitrise tres tres mal pour le moment, mais bon c'est un autre sujet... Je vais de ce pas tester return QUERY |
|
|
00
|
|
|
#8 | ||||||
|
Membre éclairé
![]() |
arg
ca se passe toujours tres mal...Je reprécise au passage que dans mes exemples, je simplifie ma fonction au max, n'imaginez pas qu'elle ne fasse qu'une simple requette ! Au debut j'ai fais mon simple return Query ... mais le compilateur n'etait pas content, disant en gros que ma fonction doit retourner un setof : Code :
Citation:
Code :
: Citation:
|
||||||
|
|
00
|
|
|
#9 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
C'est quelle version de postgresql?
|
|
|
00
|
|
|
#10 |
|
Membre éclairé
![]() |
8.2.13 que je ne peux pas mettre à jour
|
|
|
00
|
|
|
#11 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
RETURN QUERY n'existait pas encore en 8.2.
Il faudrait donc utiliser RETURN NEXT autant de fois qu'il y a de lignes à retourner suivi de RETURN pour finir. Voir la doc plpgsql pour la version 8.2: http://www.postgresql.org/docs/8.2/s...ENTS-RETURNING |
|
|
00
|
|
|
#12 |
|
Membre éclairé
![]() |
Ca fonctionne enfin comme voulu merci
Je suis juste surpris de devoir encore appeller ma fonction ainsi : Je m'attendais plus à devoir faire |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com