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

Requêtes PostgreSQL Discussion :

Fonction return setof records avec plusieur OUT paramètres


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2018
    Messages : 29
    Points : 32
    Points
    32
    Par défaut Fonction return setof records avec plusieur OUT paramètres
    Bonjour,

    Je cherche à afficher un classement a partir d'une requete et d'afficher/renvoyer tous ca avecun SETOF RECORDS.
    J'ai cherché pendant un moment sur internet pour trouver une méthode utilisant des paramètres OUT.

    Je donc ébauché cela:
    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
    28
     
    CREATE OR REPLACE FUNCTION
    get_rewards_table(OUT nomSkieur VARCHAR, OUT nVictoire integer, OUT prime integer)
    RETURNS SETOF RECORD AS $$
    DECLARE
       cursor CURSOR FOR
        SELECT s.noSkieur, s.nomSkieur, COUNT(*) as nbVictoire
        FROM skieur AS s
        INNER JOIN classement as c on c.noSkieur = s.noSkieur
        WHERE c.classement = 1
        GROUP BY s.noSkieur, s.nomSkieur;
      r integer;
    BEGIN
      FOR c_data in cursor
      LOOP
        r := c_data.nbVictoire * 10000;
        IF c_data.nbVictoire > 3
            THEN r := r + 5000;
        END IF;
        IF c_data.nbVictoire > 5
            THEN r := r + 15000;
        END IF;
     
        -- Afficher en table  c_data.nomSkieur, c_data.nbVictoire, r;
     
      END LOOP;
    END;
    $$ LANGUAGE plpgsql;
    Seulement petit problème, imposible de trouver comment renvoyer mes lignes de données pendant la loop de mon curseur.
    J'ai essayé avec différents exemples trouvés sur le net, que se soit avec un Retrun ou un SELECT mais jamais je n'obtient le résultat escompté.

    Comment puis-je faire pour afficher mes résultats ?

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    janvier 2010
    Messages
    5 344
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 344
    Points : 12 221
    Points
    12 221
    Par défaut
    Bonjour

    Pourquoi passer par un curseur, et même par une fonction ?

    Une simple vue devrait suffire :

    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
     
    SELECT 
    		nomSkieur
    	,	nbVictoire
    	,	10000 * nbVictoire + CASE
    			WHEN nbVictoire > 5 THEN 20000
    			WHEN nbVictoire > 3 THEN 5000
    			ELSE 0 
    		END AS r
    FROM (
    	SELECT s.noSkieur, s.nomSkieur, COUNT(*) as nbVictoire
        FROM skieur AS s
        INNER JOIN classement as c on c.noSkieur = s.noSkieur
        WHERE c.classement = 1
        GROUP BY s.noSkieur, s.nomSkieur;
    ) AS T

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2018
    Messages : 29
    Points : 32
    Points
    32
    Par défaut
    Je suis tout à fait d'accord, mais mon énoncé stipule de le faire avec une fonction.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    janvier 2010
    Messages
    5 344
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 344
    Points : 12 221
    Points
    12 221
    Par défaut
    Soit,

    Alors vous pouvez mettre la requête dans une fonction...

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2018
    Messages : 29
    Points : 32
    Points
    32
    Par défaut
    J'ai récrit le fonction en m'aidant de ceci (https://dba.stackexchange.com/questi...ds-in-pl-pgsql)

    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
     
    CREATE OR REPLACE FUNCTION
    get_rewards_table()
    RETURNS SETOF RECORD AS $$
    DECLARE
      rec RECORD;
    BEGIN
      SELECT 
    		nomSkieur
    	,	nbVictoire
    	,	10000 * nbVictoire + CASE
    			WHEN nbVictoire > 5 THEN 20000
    			WHEN nbVictoire > 3 THEN 5000
    			ELSE 0 
    		END AS prime
      INTO rec  
      FROM (
        SELECT s.noSkieur, s.nomSkieur, COUNT(*) as nbVictoire        FROM skieur AS s
        INNER JOIN classement as c on c.noSkieur = s.noSkieur
        WHERE c.classement = 1
        GROUP BY s.noSkieur, s.nomSkieur
      ) AS T;
      RETURN NEXT rec;
    END;
    $$ LANGUAGE plpgsql;
    Mais j'ia cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BDD=# select get_rewards_table();
    ERREUR:  fonction renvoyant un ensemble appelée dans un contexte qui ne peut pas
    accepter un ensemble
    CONTEXTE : fonction PL/pgsql get_rewards_table(), ligne 20 à RETURN NEXT

  6. #6
    Membre éprouvé
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    septembre 2016
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : septembre 2016
    Messages : 676
    Points : 1 295
    Points
    1 295
    Par défaut
    Bonjour,

    Le lien que vous proposez est très bien : l'avez-vous lu jusqu'à la fin ?

    @Klin dit:
    A better option is to use returns table(...) and return query
    Le savoir est une nourriture qui exige des efforts.

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

Discussions similaires

  1. [XL-2007] Fonction NB.SI.ENS avec plusieur critère dans la même colonne
    Par Vidjaya dans le forum Excel
    Réponses: 3
    Dernier message: 11/04/2019, 16h12
  2. [XL-2007] Aide sur la fonction somme si ens avec plusieurs onglets
    Par zakaroh dans le forum Excel
    Réponses: 4
    Dernier message: 29/04/2015, 15h23
  3. Réponses: 11
    Dernier message: 17/06/2010, 19h25
  4. [AC-2003] Fonction de moyenne pondéré avec plusieurs conditions
    Par Piccou dans le forum VBA Access
    Réponses: 34
    Dernier message: 14/08/2009, 13h07
  5. fonction RETURNS SETOF RECORD et count(): erreur
    Par ctobini dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 23/10/2006, 16h39

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