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 05/06/2007, 16h53   #1
Membre du Club
 
Inscription : février 2006
Messages : 134
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : février 2006
Messages : 134
Points : 48
Points : 48
Par défaut Function et SETOF

Bonjour voici mon probleme.
j'ai une table :
ma_table ( id , val1 , val2 , val3 )

ceci fonctionne
Code :
1
2
3
4
 
CREATE FUNCTION test( IN id ) RETURNS SETOF ma_table  AS '
SELECT * FROM ma_table WHERE id = $1;
' LANGUAGE SQL;
Mais pourqoi cela ne fonctionne pas
Code :
1
2
3
4
 
CREATE FUNCTION test( IN id ) RETURNS SETOF ma_table  AS '
SELECT val1 FROM ma_table WHERE id = $1;
' LANGUAGE SQL;
ERROR: return type mismatch in function declared to return ma_table
DETAIL: Final SELECT returns too few columns.
CONTEXT: SQL function "test"
mikebranque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2007, 17h03   #2
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
Je viens de tester avec une table en locale, ça marche très bien. Par contre, (et je ne sais pas si ça peut t'aider) j'ai mis en return setof record.

A+
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2007, 17h12   #3
Membre du Club
 
Inscription : février 2006
Messages : 134
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : février 2006
Messages : 134
Points : 48
Points : 48
Citation:
Envoyé par budtucker
Je viens de tester avec une table en locale, ça marche très bien. Par contre, (et je ne sais pas si ça peut t'aider) j'ai mis en return setof record.

A+
Peux tu me donner ton code exacte car je n'arrive pas a reproduire
mikebranque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2007, 18h46   #4
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
Ah !! euhh !! je l'ai effacé, mais ça donne à peu près ça normalement :
Code :
1
2
3
CREATE FUNCTION test( integer ) RETURNS SETOF record  AS '
SELECT val1 FROM ma_table WHERE id = $1;
' LANGUAGE SQL;
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 09h36   #5
Membre du Club
 
Inscription : février 2006
Messages : 134
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : février 2006
Messages : 134
Points : 48
Points : 48
Merci
mikebranque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 14h18   #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
Bonjour,

c'est tout à fait normal, tu déclares que ta fonction retourne un jeu d'enregistrements de type ma_table, or ce type composite regroupe id, val1, val2 et val3. Si tu ne retournes que val1, les types ne concordent pas, et c'est la signification du message d'erreur que tu obtiens.

En déclarant record comme type de retour, ta fonction peut renvoyer n'importe quel jeu d'enregistrements. Ca règle ton problème immédiat, mais ça risque d'en poser d'autres ultérieurement. Il vaut mieux dans ce cas, si val1 est un integer par exemple, déclarer RETURNS SETOF integer.
__________________
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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h58.


 
 
 
 
Partenaires

Hébergement Web