|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
Bonjour,
Je travaille sur une procédure devant renvoyer plusieurs éléments contenant 2 valeurs. Je pensais donc naïvement renvoyer des paires de variables (récupérées dans la procédure) en spécifiant un type de retour que j'ai créé avec CREATE TYPE pour la sortie de la fonction. Mais je n'ai pas trouvé si c'était faisable, et en cherchant j'ai lu une solution alternative qui serait de créer une table temporaire et de la remplir. Est-ce que mon idée de départ est réalisable, et si oui, est-elle meilleure ou moins moins bonne que l'autre ? Sachant qu'il s'agit de récupérer et construire des résultats, donc potentiellement avoir plusieurs appels concurrents à cette procédure. Merci d'avance. |
|
00
|
|
|
#2 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
En plpgsql, on peut faire RETURNS type avec un type composite ou bien RETURNS SETOF type s'il s'agit de retourner plusieurs lignes de ce type composite.
C'est sans problème. |
|
|
00
|
|
|
#3 |
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
En fait ma question était plutôt comment on renvoie effectivement les valeurs, comment on construit une ligne du type composé. D'après la doc il faut renvoyer une variable de type RECORD ou ROW, mais la ligne que je veux renvoyer est composée de plusieurs variables et je ne vois pas comment les regrouper.
|
|
00
|
|
|
#4 | ||
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Tu peux retourner une variable du type composé en question après avoir rempli les champs un par un.
Par exemple: Code :
|
||
|
|
10
|
|
|
#5 |
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
Merci de cette réponse claire !
|
|
00
|
|
|
#6 | ||
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
En fait je suis confronté à un autre problème pour renvoyer mon type créé, en sortie j'obtiens une seule colonne contenant mes deux champs rassemblés en une chaîne (champ1,champ2), où la colonne est le nom de ma fonction. Aussi bien en sortie dans psql qu'au travers d'une lib (ruby).
J'ai essayé de renvoyer des lignes d'une vraie table et pas d'un type créé, c'est la même chose. C'est très embêtant pour travailler sur le résultat, et je m'étonne de ce comportement par défaut. Comment faut il s'y prendre pour récupérer une sortie semblable à une requête SQL classique ? Merci d'avance. Au cas où voici la fonction : Code :
|
||
|
00
|
|
|
#7 | ||
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Depuis PostgreSQL 8.4 (de mémoire), les fonctions peuvent retourner un type TABLE. Plus besoin de passer par les types...
Du coup, en sortie, on récupère une sortie semblable à une requête classique. Le lien vers la doc : http://docs.postgresql.fr/8.4/sql-createfunction.html Il y a un exemple en bas de page, pour une fonction en SQL, mais c'est pareil en PL/PGSQL. Il suffit d'exécuter un SELECT en fin de fonction... Voici un autre exemple : Code :
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
||
|
|
10
|
|
|
#8 |
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
Merci de ta réponse, en me renseignant sur RETURNS TABLE j'ai lu que cela retournait aussi des résultats concaténés, et que la forme du résultat dépend de la manière d'exécuter la fonction. Jusque là je faisais SELECT ma_fonction();, mais pour obtenir les résultats avec des colonnes distinctes et nommées il faut faire SELECT * FROM ma_fonction();.
Du coup je n'ai pas besoin d'utiliser RETURNS TABLE. Mais ça me semble plus concis, car ça évite de créer un type. Par contre dans les exemples, il n'y a qu'un RETURN sur une requête, dans mon cas je construis mes résultats au fur et à mesure, il n'est pas possible d'en obtenir l'ensemble en une seule ligne. Est-ce qu'il est possible de renvoyer comme avec SETOF les valeurs ligne par ligne ? Je n'ai pas trouvé d'indication dans la doc ou sur le net. |
|
00
|
|
|
#9 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Habituellement, quand j'ai besoin de faire ce genre de choses, je crée une table temporaire que je remplis au fur et à mesure de l'exécution de la fonction, puis je fais un SELECT final qui renvoie tout ce dont j'ai besoin.
Je pense que si tu fais plusieurs SELECT successifs, tu n'auras que les résultats de dernier SELECT (mais je n'ai jamais testé).
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
00
|
|
|
#10 | |||
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Citation:
Par exemple: Code :
test=> select * from f(); i | r ------+--- -2.5 | 2 -4.5 | 3 |
|||
|
|
20
|
|
|
#11 |
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
Merci, ça marche parfaitement
|
|
00
|
Copyright © 2000-2012 - www.developpez.com