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 :

Type de retour fonction PL/PGSQL


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut Type de retour fonction PL/PGSQL
    Bonjour,

    J'ai crée une fonction qui construit dynamiquement une requête et qui retourne son résultat... Cette requête peut retourner plusieurs lignes, mais mon problème est que je ne sais pas quel type de donées est retourné...
    CREATE FUNCTION BLABLA(.....) RETURNS XXX
    DECLARE
    result le type qui va bien;
    query character varying;
    BEGIN

    // Construction de la requête
    query := 'SELECT ...........';

    execute query into result;

    return result;

    END;
    Merci de votre aide
    "Patience et longueur de temps font plus que force ni que rage ..."

  2. #2
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Bonjour,

    il faut SET OF

    regarde dans la FAQ :
    http://postgresql.developpez.com/faq...kees#appelproc

    il y a un exemple d'utilisation
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    Après vérification dans la doc, je déclare ma fonction avec un type de retour SETOF RECORD.

    Je boucle
    for rec in (select........)
    loop
    return next rec;
    end loop;
    J'ai l'erreur suivante en exécutant ma fonction
    select maFonction(..);
    ==>
    ERROR: set-valued function called in context that cannot accept a set
    Des idées ?
    "Patience et longueur de temps font plus que force ni que rage ..."

  4. #4
    Membre chevronné
    Avatar de kedare
    Homme Profil pro
    Network Automation Engineer
    Inscrit en
    Juillet 2005
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Network Automation Engineer

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 548
    Points : 1 861
    Points
    1 861
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from mafonction()
    essais ca

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    Avec
    Select * from maFonction(...);
    J'obtiens l'erreur suivante:

    ERROR: a column definition list is required for functions returning "record"

    ********** Erreur **********

    ERROR: a column definition list is required for functions returning "record"
    État SQL :42601
    "Patience et longueur de temps font plus que force ni que rage ..."

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour ,
    est ce que ce n'est pas SETOF en un seul mot ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    Si c'est bien SETOF en un seul mot.
    C'est une erreur de recoipe que je modifie de suite dans mon post.
    Mon code comporte bien le mot clé SETOF.

    Je te remercie..

    Des idées ?
    "Patience et longueur de temps font plus que force ni que rage ..."

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    create or replace function ma_fonction() returns  setof ma_table as 
    $BODY$
    declare
     r ma_table%rowtype;
    begin
     for r in  select *  from ma_table where ....
    	loop
    		return next r;
    	end loop;
    	return   ;
    end
    $BODY$
    language 'plpgsql';
    puis pour lancer la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from ma_fonction()

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    En fait mon select ne remonte pas les données d'une table mais retourne les résultat d'un calcul.

    Je suppose qu'il faut déclarer un type pour affecter à mon record, comment faire ?

    Voici mon select:
    select 'cas1', count(*) as total from table1 where ..... group by....;
    Merci
    "Patience et longueur de temps font plus que force ni que rage ..."

  10. #10
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour,
    tu crées un type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create type essai as ("cas1" varchar(),total integer)
    en supposant que "cas1" est du type varchar

    puis tu change la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create or replace function ma_fonction() returns  setof essai as 
    $BODY$
    declare
     r essai%rowtype;
    ...

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    Je déclare mon type de la façon suivante:
    CREATE TYPE test AS (ordre integer, tranche character varying, frequence integer);
    Je déclare ma fonction de la façon suivante:
    CREATE OR REPLACE FUNCTION repartition_ages(....) RETURNS SETOF test AS
    $BODY$
    DECLARE
    ......
    ii integer;
    jj integer;
    query character varying;
    rec test%rowtype;
    query := 'SELECT '||jj||' as ordre, ''<'||age_min||''' as tranche, count(*) as frequence FROM patient WHERE .....;
    Et je termine ma fonction par:
    for rec in execute query loop
    return next rec;
    end loop;
    Pour obtenir toujours l'erreur suivante:
    INFO: 1

    ERROR: set-valued function called in context that cannot accept a set
    CONTEXT: PL/pgSQL function "repartition_ages" line 77 at return next

    ********** Erreur **********

    ERROR: set-valued function called in context that cannot accept a set
    État SQL :0A000
    Contexte : PL/pgSQL function "repartition_ages" line 77 at return next
    "Patience et longueur de temps font plus que force ni que rage ..."

  12. #12
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    tu appelles bien la fonction par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from ma_fonction()

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    Non...

    Effectivement et ça marche très bien en l'invoquant comme ça
    sleect * from maFonction(...);
    Merci pour ton aide...
    "Patience et longueur de temps font plus que force ni que rage ..."

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

Discussions similaires

  1. Type de retour d'une fonction PL/PGSQL
    Par the java lover dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/01/2009, 11h13
  2. Réponses: 19
    Dernier message: 12/12/2007, 15h00
  3. Réponses: 1
    Dernier message: 25/01/2006, 10h30
  4. Perte de type en retour de fonction
    Par Bebel dans le forum Langage
    Réponses: 8
    Dernier message: 22/12/2005, 12h54
  5. [Oracle 9.1] Types de retour d'une fonction PL/SQL
    Par ftrifiro dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/10/2005, 16h54

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