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 :

Fonction qui retourne un tableau et non des lignes


Sujet :

PostgreSQL

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut Fonction qui retourne un tableau et non des lignes
    Bonjour à tous,

    J'ai créé une fonction qui exécute différents SELECT selon les paramètres. Le souci, c'est qu'elle me retourne le résultat sur forme de lignes telles que
    ('ligne 1','aaa','sqdddqsd','qsdqsfdgg')
    ('ligne 2','adssaa','siqjkdqsd','qsjkljkldgg')
    etc

    et je voudrais qu'elle me retourne un tableau (colonnes et lignes).

    Quelle est la syntaxe à utiliser pour la fonction ? Voici celle que j'ai faite :
    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
     
    CREATE TYPE tbl_ges1 AS(
       c1 varchar, 
       c2 varchar, 
       c3 numeric, 
       c4 numeric,  
       c5 numeric, 
       c6 numeric, 
       c7 numeric,  
       c8 numeric, 
       c9 numeric, 
       c10 numeric 
    );
     
    CREATE OR REPLACE FUNCTION GES1(fcy text, dd Date, df Date, itg text, fam text) RETURNS SETOF tbl_ges1 AS $$
    DECLARE
    records tbl_ges1%ROWTYPE;
     
    BEGIN
    .....
    SELECT INTO records {REQUETE_SELECT}
    .....
    END;
    $$ LANGUAGE plpgsql;

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Il y a assez peu d'informations.
    Toutefois, pour avoir un ensemble de ligne avec la clause SETOF ... il faut utiliser RETURN NEXT à chaque ligne extraites.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par alassanediakite Voir le message
    Salut
    Il y a assez peu d'informations.
    Toutefois, pour avoir un ensemble de ligne avec la clause SETOF ... il faut utiliser RETURN NEXT à chaque ligne extraites.
    @+
    Bonjour, merci d'avoir répondu à ce poste.

    En fait, j'arrive à avoir toutes mes lignes. Le problème c'est que ces lignes me sont retournées sans COLONNE. Je retrouve mes valeurs séparées par des virgules !!!
    Ce que moi je veux c'est qu'on me retourne un TABLEAU comme si je faisais un SELECT directement dans le requêteur.

    Du coup, j'ai un doute, est-ce que j'utilise la bonne méthode ? J'ai essayé d'utiliser EXECUTE mais le résultat est le même !

    Je précise que ce que je veux, c'est que selon mes paramètres, la fonction exécute telle ou telle requête. Le résultat voulu doit être affiché sous forme de tableau.

    Comment procéder ?

    Merci encore

  4. #4
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Un exemple (avec 9.3.3 )...
    les objets
    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
    CREATE TYPE tbl_ges1 AS(
       c1 varchar, 
       c2 varchar
    );
     
    CREATE OR REPLACE FUNCTION GES1() RETURNS SETOF tbl_ges1 AS $$
    DECLARE
    records tbl_ges1%ROWTYPE; 
    BEGIN
     
    select 'z','b' into records;
    return next records;
    select 'a','c' into records;
    return next records;
    END;
    $$ LANGUAGE plpgsql;
     
    select * from GES1();
    J'obtiens le résultat sous forme de table
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  5. #5
    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
    Citation Envoyé par siro1 Voir le message
    Quelle est la syntaxe à utiliser pour la fonction ?
    Ce n'est pas la fonction qui est en cause, c'est l'appel. Avec cette forme-là:
    le résultat est demandé dans une seule colonne en un type composite.

    Pour avoir un résultat en multi-colonnes, il faut utiliser cette forme-là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select c1,c2,... from mafonction();
    on peut aussi utiliser * au lieu lister les colonnes.

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut
    Merci pour cette information, cela fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE FUNCTION GES1(fcy text, ddn1 Date, dfn1 Date, itg text, fam text) RETURNS SETOF RECORD AS $$
    BEGIN
    ...
    RETURN QUERY EXECUTE ' {Mon_select_avec_$1_$2_etc}' using fcy,ddn1,{etc}
    ...
    $$ LANGUAGE plpgsql;
    Par contre, j'ai une autre question concernant les paramètres de type dates...
    Je voudrais avoir les meme date ddn1 et dfn1 avec une année de moins...
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE FUNCTION GES1(fcy text, ddn1 Date, dfn1 Date, itg text, fam text) RETURNS SETOF RECORD AS $$
    BEGIN
    ...
    RETURN QUERY EXECUTE ' {Mon_select_avec_$1_$2_etc} WHERE date BETWEEN  {ici_ma_date_n-1} AND ''$2'' ' using fcy,ddn1,{etc}
    ...
    $$ LANGUAGE plpgsql;
    avec {ici_ma_date_n-1} = '||to_char((Date '||$2||' - interval '1 year'), 'YYYY-MM-DD')||'

    Il me parle d'erreur de syntaxe...
    Mon procédé est-il bon ? Comment avoir la date n-1 dans un QUERY EXECUTE '...' ???

    Merci à vous

  7. #7
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Corrige...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {ici_ma_date_n-1} = '||to_char((Date '||$2||' - interval '1 year'), 'YYYY-MM-DD')||'
    par...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {ici_ma_date_n-1} = '||to_char((ddn1 - interval '1 year'), 'YYYY-MM-DD')||'
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut
    Bonjour Alassanne,

    Merci d'être actif sur cette discussion ...

    BETWEEN ''||to_char((ddn1 - interval ''''1 year''''), ''''YYYY-MM-DD'''')||'' AND... voici ce que j'ai corrigé si je ne double pas les simple cote cela me met une erreur de syntaxe.

    mais cette correction , me pose un problème : Pas de resultat.
    Alors que si je saisie les date en dure, j'ai bien des données...

  9. #9
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Remplace tous les doubles quotes par de simples quotes!
    Pas de quotes (ni simple ni double) autour de $2.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut
    bien vu ! ca fonctionne ! un grand merci à tous !

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

Discussions similaires

  1. [Tableaux] Fonction qui retourne un tableau
    Par benooiit dans le forum Langage
    Réponses: 2
    Dernier message: 05/01/2007, 01h50
  2. Réponses: 6
    Dernier message: 22/09/2006, 18h17
  3. Fonction qui retourne un tableau ou 2 variables ? possible ou non
    Par jiojio dans le forum VB 6 et antérieur
    Réponses: 45
    Dernier message: 05/06/2006, 15h00
  4. [VB] Fonction qui retourne un tableau
    Par ptitsoleil87 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 24/12/2005, 10h52
  5. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06

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