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 :

RETURN résultat d'une requête (multicolonne) dans fonction PLPGSQL ?


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut RETURN résultat d'une requête (multicolonne) dans fonction PLPGSQL ?
    Bonjour j'ai un nouveau petit problème (il y avait longtemps... ) :

    Je voudrais renvoyer via une fonction le résultat d'une requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE FUNCTION select_all(INTEGER) RETURNS RECORD AS '
            DECLARE
             uni ALIAS FOR $1;
             rec RECORD;
            BEGIN
            SELECT INTO rec (SELECT g.gid_id AS GID, g.hugo AS HUGO, g.descr AS GID_DESCR, g.fam AS FAM, g.chrs AS GID_CHRS, h.hs_id AS UNIGENE, s.symb AS SYMB, d.descr AS DESCR, sd.chrs AS NCBI_CHRS FROM gids AS g LEFT OUTER JOIN gids_hs AS ghs USING(gid_id) LEFT OUTER JOIN hs AS h USING(hs_id) LEFT OUTER JOIN symbole_description AS sd USING(gid_id) LEFT OUTER JOIN symbole AS s USING(symb_id) LEFT OUTER JOIN description AS d USING(descr_id) WHERE h.hs_id = uni);
            RETURN rec;
            END;
            ' LANGUAGE 'PLPGSQL';
    Mais j'ai une erreur :
    ERREUR: La sous-requête doit renvoyer une seule colonne [...]

    Je n'arrive pas à manipuler des requêtes au sein d'une fonction, soit afin de renvoyer la requête entière, soit pour extraire les différents élements de ces requêtes.

    Merci si vous pouvez m'aider.

    Bonne soirée,

    C. Tobini

  2. #2
    Membre éclairé Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Points : 781
    Points
    781
    Par défaut
    CREATE FUNCTION select_all(INTEGER) RETURNS SETOF RECORD AS '
    DECLARE
    uni ALIAS FOR $1;
    rec RECORD;
    BEGIN
    SELECT INTO rec
    g.gid_id AS GID,
    g.hugo AS HUGO,
    g.descr AS GID_DESCR,
    g.fam AS FAM,
    g.chrs AS GID_CHRS,
    h.hs_id AS UNIGENE,
    s.symb AS SYMB,
    d.descr AS DESCR,
    sd.chrs AS NCBI_CHRS
    FROM gids AS g
    LEFT OUTER JOIN gids_hs ghs USING(gid_id)
    LEFT OUTER JOIN hs h USING(hs_id)
    LEFT OUTER JOIN symbole_description sd USING(gid_id)
    LEFT OUTER JOIN symbole s USING(symb_id)
    LEFT OUTER JOIN description d USING(descr_id)
    WHERE h.hs_id = uni;

    RETURN rec;
    END;
    ' LANGUAGE 'PLPGSQL';
    Dejà, pas de 'AS' pour les alias de tables.
    Ensuite, la syntaxe de SELECT INTO est :

    SELECT INTO variable
    *
    FROM
    ....
    et non pas :
    SELECT INTO variable
    (select *
    FROM
    ...)
    Ensuite le 'RETUNRS SETOF ' devrait te permettre de renvoyer plusieurs lignes.

    En espérant que ca te débloque!
    ++
    Two beer or not two beer. (Shakesbeer)
    Question technique par MP => poubelle!

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour et merci beaucoup de la réponse, elle a pu m'aiguiller vers une solution, j'ai néanmoins un petit problème, j'ai réécris ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE FUNCTION select_all(INTEGER) RETURNS SETOF RECORD AS '
            DECLARE
             uni ALIAS FOR $1;
             rec RECORD;
            BEGIN
            FOR rec IN SELECT g.gid_id AS GID, g.hugo AS HUGO, g.descr AS GID_DESCR, g.fam AS FAM, g.chrs AS GID_CHRS, h.hs_id AS UNIGENE, s.symb AS SYMB, d.descr AS DESCR, sd.chrs AS NCBI_CHRS FROM gids AS g LEFT OUTER JOIN gids_hs AS ghs USING(gid_id) LEFT OUTER JOIN hs AS h USING(hs_id) LEFT OUTER JOIN symbole_description AS sd USING(gid_id) LEFT OUTER JOIN symbole AS s USING(symb_id) LEFT OUTER JOIN description AS d USING(descr_id) WHERE h.hs_id = uni
            LOOP
             RETURN NEXT rec;
            END LOOP;
             RETURN;
            END;
            ' LANGUAGE 'PLPGSQL';
    Puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM select_all('523463')
    Mais j'ai une erreur :

    ERREUR: Une colonne liste est requise pour les fonctions renvoyant "record"

    J'ai jeté un oeil sur le net, mais je ne vois pas quel peut être le problème, il y a plusieurs exemple mais rien n'est abordé concernant ceci.

    Verrais-tu d'où peut provenir cette erreur ?

  4. #4
    Membre éclairé Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Points : 781
    Points
    781
    Par défaut
    essaye en remplacant les noms de colonnes par *
    juste pour vérifier ...
    Two beer or not two beer. (Shakesbeer)
    Question technique par MP => poubelle!

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Le remplacement de noms de colonnes par * n'a pas fonctionné, en revanche j'ai déclaré la sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from select_all('523463') as (gid_id int, hugo text, descr text, fam text, chrs text, hs_id int, symb text, descr2 text, chrs2 text);
    Et la ça fonctionne.

    Apparement on peut aussi déclarer le type et créer un enregistrement en tant que ce type, de cette manière la requête s'effectue comme sur une table classique.

    Merci beaucoup pour ton aide et bonne journée.

    C. Tobini

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

Discussions similaires

  1. [SQL-VBA] récupérer le résultat d'une requète SQL dans un fichier txt
    Par djidanestribbal dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 13/02/2007, 16h25
  2. Résultat d'une requête affiché dans une infobulle
    Par angus42 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/10/2006, 12h04
  3. résultat d'une requête Somme dans un formulaire
    Par chrislauxerrois dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/08/2006, 16h29
  4. [Conception] Résultat d'une requête PHP dans un tableau avec lien ?
    Par DjMaC dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/04/2006, 21h37
  5. récupérer le résultat d'une requête sql dans un edit
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/07/2005, 15h07

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