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 :

[Débutant]Créer une fonction qui renvoie le résultat d'un SELECT


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Points : 53
    Points
    53
    Par défaut [Débutant]Créer une fonction qui renvoie le résultat d'un SELECT
    Bonjour,

    Je débute avec PostGresSQL et je voudrais créer une fonction prenant 2 paramètre et me renvoyant le résultat d'un SELECT.
    Le résultat étant sur plusieurs enregistrements, si j'ai bien compris je dois utiliser un curseurs et un record qui contiendra 1 enreg. De là avec une boucle je devrais pouvoir retourner mes enregistrements.

    Et bien non
    J'ai une erreur de concernant le return.
    Déjà pourriez-vous me dire si je suis sur le bon chemin?

    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Quel est le message d'erreur?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Le message d'erreur est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ERREUR:  erreur de syntaxe sur ou près de « LOOP »
    LIGNE 21 : END LOOP;
    Merci

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Pour ce type d'erreur (de syntaxe) il faudrait le code complet de la fonction pour dire ce qu'il en est.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Points : 53
    Points
    53
    Par défaut
    (et c'est pas peu dire!!!!)

    Voilà le code incriminé!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    CREATE OR REPLACE FUNCTION clientsactuels(nomHotel VARCHAR, villeHotel VARCHAR) RETURNS SETOF RECORD AS $$
     
    DECLARE
    cClients CURSOR FOR SELECT nom
    	FROM occupation
    	JOIN ( SELECT numhotel
            FROM hotel
            WHERE nom = nomHotel AND ville = villeHotel ) AS hotelParam
         ON hotelParam.numhotel = occupation.numhotel
    JOIN client ON client.numclient = occupation.numclient;
     
    les_clients RECORD;
    BEGIN
     
    OPEN cClients;
    FETCH cClients INTO les_clients;
    WHILE FOUND LOOP
    BEGIN
    FETCH cClients INTO les_clients;
    CLOSE cClients;
    END LOOP;
    RETURNS les_clients;
    CLOSE cClients;
    END;
     
    $$ LANGUAGE plpgsql;
    Et encore merci d'aider un d'une telle espèce

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il y a plusieurs problèmes:
    - à l'intérieur de la boucle while, il ne faut pas fermer le curseur sinon il n'est pas possible de boucler dessus
    - toujours à l'intérieur de la boucle while, il y a un BEGIN inutile qui de plus n'est pas fermé par un END, apparemment. il faudrait le supprimer
    - RETURNS est une déclaration, il ne doit pas être utilisé comme instruction dans du code (c'est RETURN sans S)
    - pour une fonction qui renvoie du type SETOF (ensemble de lignes), il faut utiliser RETURN NEXT à l'intérieur de la boucle (consulter la doc officielle pour l'usage de RETURN NEXT)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Points : 53
    Points
    53
    Par défaut
    Merci ma fonction ne renvoie plus d'erreur

    Par contre quand j'appelle ma fonction avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM clientsactuels ('machine', 'ici');
    J'obtiens une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    une liste de définition de colonnes est requise pour les fonctions renvoyant
    un « record »
    Bon je comprends qu'il a besoin d'une liste de colonne mais ne peut-on pas utiliser * pour lui spécifier toutes les colonnes du "record"?

    Encore merci

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Le problème est qu'un RECORD est anonyme, on ne peut pas préjuger à l'avance ni du nom ni du type des colonnes qu'il va y avoir à l'intérieur. Or le SGBD a besoin de cette information pour organiser l'exécution de la requête.
    Dans le cas de ta fonction, ma suggestion serait de ne pas retourner un record mais un SETOF text.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Points : 53
    Points
    53
    Par défaut
    Merci beaucoup

    C'est exactement ce qu'il me fallait

    J'aurais quand voulu savoir dans quel cas utilise-t-on un record?

    Encore merci

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

Discussions similaires

  1. Créer une fonction qui renvoie un vecteur
    Par Avatar36 dans le forum Langage
    Réponses: 22
    Dernier message: 15/05/2014, 12h59
  2. appel d'une procédure qui renvoie le résultat d'une requete
    Par audreyc dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 16/03/2006, 14h02
  3. [9i] PLS-00320 avec une fonction qui renvoi un curseur
    Par hoaxpunk dans le forum Oracle
    Réponses: 5
    Dernier message: 09/02/2006, 17h04
  4. Réponses: 2
    Dernier message: 09/01/2006, 19h45
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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