IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Function et SETOF


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2006
    Messages : 134
    Points : 81
    Points
    81
    Par défaut Function et SETOF
    Bonjour voici mon probleme.
    j'ai une table :
    ma_table ( id , val1 , val2 , val3 )

    ceci fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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"

  2. #2
    Membre habitué Avatar de budtucker
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 176
    Points : 197
    Points
    197
    Par défaut
    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+
    Sud04

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2006
    Messages : 134
    Points : 81
    Points
    81
    Par défaut
    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

  4. #4
    Membre habitué Avatar de budtucker
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 176
    Points : 197
    Points
    197
    Par défaut
    Ah !! euhh !! je l'ai effacé, mais ça donne à peu près ça normalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE FUNCTION test( integer ) RETURNS SETOF record  AS '
    SELECT val1 FROM ma_table WHERE id = $1;
    ' LANGUAGE SQL;
    Sud04

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2006
    Messages : 134
    Points : 81
    Points
    81
    Par défaut
    Merci

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. implicit declaration of function
    Par guillaume_pfr dans le forum C
    Réponses: 7
    Dernier message: 12/06/2003, 10h59
  2. [POSTGRESQL] exec function
    Par peuh dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/05/2003, 15h15
  3. A propos des 'File management Functions' de Windows
    Par znaidi dans le forum Windows
    Réponses: 3
    Dernier message: 01/04/2003, 16h01
  4. [postgreSQL] équivalent de la function 'instr'
    Par Dra_Gun dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2003, 16h09
  5. [Dev c++ 4] implicite declaration of function "int kbhi
    Par Torpedox dans le forum Dev-C++
    Réponses: 5
    Dernier message: 01/01/2003, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo