Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/05/2006, 12h44   #1
Membre confirmé
 
Inscription : septembre 2003
Messages : 302
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : septembre 2003
Messages : 302
Points : 251
Points : 251
Par défaut retour d'une fonction

Bonjour,

j'ai une fonction qui prend en paramètre un entier (correspondant à l'id d'une table) me retourne un varchar du type : (qui sont en fait les id d'une table séparés par une virgule
Le problème est lorsque j'exécute cette requete :
Code :
SELECT * FROM matable WHERE id IN (SELECT mafonction(x));
Cette requete ne me renvoit rien alors que la requete :
Code :
SELECT * FROM matable WHERE id IN (1,2,3);
mer envoit le résultat tant espéré

Est-ce du au retour de ma fonction qui est un varchar ??

Merci d'avance
__________________
L'héroïsme, c'est encore la meilleure façon de devenir célèbre quand on n'a pas de talent
Pierre Desproges
papy_tergnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2006, 14h05   #2
Membre du Club
 
Inscription : décembre 2005
Messages : 81
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 81
Points : 66
Points : 66
Envoyer un message via MSN à jarod_ab
bonjour...
je pense que le pbm vient peut être de la fonction. essaye de mettre le corps de ta fonction pour qu'on voit mieux.
cordialement.
jarod_ab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2006, 14h49   #3
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Bonjour,

Citation:
Envoyé par papy_tergnier
Est-ce du au retour de ma fonction qui est un varchar ??
Oui.

Ta fonction doit retourner un jeu d'enregistrement comportant un seul champ de type entier ; en d'autres termes, ta fonction doit retourner un SETOF int4.
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2006, 15h01   #4
Membre confirmé
 
Inscription : septembre 2003
Messages : 302
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : septembre 2003
Messages : 302
Points : 251
Points : 251
en fait j'ai donné cet exemple pour simplifier mais la fonction citée appelle 2 autres fonctions qui sont assez compliquées si tu n'as pas le modèle de ma base de données en tête (qui est très lourd).
Donc je suis en train d'essayer une autre méthode qui me confirmera si cela vient du retour en varchar ou du retour de ma fonction qui n'est pas bon.
Je vous tiendrai au courant mais si quelqu'un a déjà eu le même type de souci je suis preneur.
__________________
L'héroïsme, c'est encore la meilleure façon de devenir célèbre quand on n'a pas de talent
Pierre Desproges
papy_tergnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2006, 15h54   #5
Membre confirmé
 
Inscription : septembre 2003
Messages : 302
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : septembre 2003
Messages : 302
Points : 251
Points : 251
Bon alors conclusion finale.
J'ai réussi grace à ma méthode : en fait je découpe ma chaine de caractère et je stocke tous mes élèments dans un tableau d'entiers.

GrandFather : je ne connaissais pas le SETOF mais si j'ai bien compris c'est plus ou moins ce que je fais ? Si j'ai compris les docs que j'ai lu, SETOF int4 renvoit un tableau d'entiers ? Je n'ai pas utilisé cette méthode car j'étais déjà parti sur mon autre méthode et que repartir sur un SETOF impliquait de changer d'autres fonctions qui étaient appelées par ma fonction mais par la suite ça peut bien m'aider.

Merci
__________________
L'héroïsme, c'est encore la meilleure façon de devenir célèbre quand on n'a pas de talent
Pierre Desproges
papy_tergnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2006, 17h13   #6
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Citation:
Envoyé par papy_tergnier
Si j'ai compris les docs que j'ai lu, SETOF int4 renvoit un tableau d'entiers ?
Pas exactement, SETOF te retourne un jeu d'enregistrement, une table virtuelle en quelque sorte. En précisant int4, le jeu d'enregistrement est composé de tuples avec un seul champ, de type entier. Mais il est possible de renvoyer un jeu d'enregistrement composé de tuples du type d'une de tes tables ou même d'un type personnalisé. C'est une fonctionnalité très puissante, qui ouvre énormément de possibilités. C'est la façon dont les procédures stockées, utilisées dans d'autres SGBD, sont implémentées dans PostgreSQL.

Pour ton problème présent, tu l'as résolu en utilisant une forme de IN qui accepte les valeurs scalaires ; dans ce contexte, c'est plus performant qu'utiliser la version de IN qui prend en paramètre une sous-requête, constituée par une fonction retournant un SETOF.
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2006, 17h21   #7
Membre confirmé
 
Inscription : septembre 2003
Messages : 302
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : septembre 2003
Messages : 302
Points : 251
Points : 251
merci !!!
comme tu dis ça a l'air bien puissant !!!

A+
__________________
L'héroïsme, c'est encore la meilleure façon de devenir célèbre quand on n'a pas de talent
Pierre Desproges
papy_tergnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h43.


 
 
 
 
Partenaires

Hébergement Web