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

Requêtes PostgreSQL Discussion :

Aide fonction PL/pgSQL


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Autre
    Inscrit en
    mars 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : mars 2021
    Messages : 28
    Points : 16
    Points
    16
    Par défaut Aide fonction PL/pgSQL
    Bonjour,
    j'ai encore besoin de votre aide concernant une fonction en pl/pgSQL, j'ai un peu de mal à structurer ces fonctions malgré je commence à me débrouiller pour les requetés simples


    j'ai une table : id_auditeur, ue, note1, note2

    voici la fonction à créer :
    Créer une fonction qui prend trois paramètres : un code auditeur et deux codes d’unités d’enseignement et qui retourne vrai si l’auditeur les a validés toutes les deux et faux sinon (l'ue est validée quand note1 ou note 2 est égale ou supérieur à 10)

    j'ai commencé à initialiser des variables avec les 3 paramètres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create function validation (INTEGER,VARCHAR, VARCHAR) returns boolean as'
    declare
    auditeur alias for $1;
    ue1 alias for $2;
    ue2 alias for $3;
    puis pour la suite j'ai des doutes si il faut ajouter une variable qui stocke la requete.... pour aller chercher les valeurs dans ma table... et par la suite les conditions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Begin
    select into validation auditeur, ue
    where id_auditeur = $1
    and note1 >=10 or note2 >=10;
    merci pour votre aide
    bonne journée

  2. #2
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    mai 2008
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2008
    Messages : 222
    Points : 408
    Points
    408
    Par défaut
    Essayez ceci, je ne l'ai pas testé, c'est pour vous donner une piste :
    A quoi vous servent les paramètres ue1_ , ue2_ dans la fonction ?

    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
     
    CREATE FUNCTION validation ( id_auditeur_ integer, ue1_ varchar, ue2_ varchar ) returns boolean
     
    AS $$
    DECLARE
    	validation integer;
     
    BEGIN
     
    	SELECT id_auditeur
    	INTO validation
    	WHERE id_auditeur = id_auditeur_ AND note1 >=10 AND note2 >=10;
     
    	IF validation IS NULL THEN
    		return false;
    	ELSE 
    		return true;
    	END IF;
     
    END
    $$ LANGUAGE plpgsql;

  3. #3
    Membre à l'essai
    Homme Profil pro
    Autre
    Inscrit en
    mars 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : mars 2021
    Messages : 28
    Points : 16
    Points
    16
    Par défaut Aide fonction PL/pgSQL
    Bonjour,
    je vous remercie pour votre réponse et votre aide,
    Concernant les 2 paramètres ue chaque auditeur peut s'inscrire à plusieurs unité d'enseignement et les valider. Dans cet exercice on me demande :
    Créer une fonction qui prend trois paramètres : un code auditeur et deux codes d’unités d’enseignement et qui retourne vrai si l’auditeur les a validés toutes les deux et faux sinon (l'ue est validée quand note1 ou note 2 est égale ou supérieur à 10).
    Donc je suppose que lors du test je mettrai comme paramètre un auditeur et deux ue de mon choix.

    j'aurais quelques question sur votre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE FUNCTION validation ( id_auditeur_ integer, ue1_ varchar, ue2_ varchar ) returns boolean
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create function validation (INTEGER,VARCHAR, VARCHAR) returns boolean as'
    declare
    auditeur alias for $1;
    ue1 alias for $2;
    ue2 alias for $3;
    est ce que la déclaration des variables dans votre code et le mien c'est la même chose ou bien je me suis mal pris?

    je mets as ' par contre vous mettez $$ deux fois dans votre code. Pourquoi vous remplacez as' par as $$?
    si les $$ représente les paramètres normalement j'en ai 3?
    j'ai souvent trouvé ce format à la place de as' mais je n'ai pas trouvé l'explication.
    merci encore pour votre aide

  4. #4
    Membre à l'essai
    Homme Profil pro
    Autre
    Inscrit en
    mars 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : mars 2021
    Messages : 28
    Points : 16
    Points
    16
    Par défaut PL/pgSQL les fonctions
    Bonjour,
    j'y suis presque, par contre ma fonction me donne toujours true
    voici ce que j'ai fait :
    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
    CREATE FUNCTION validation2 ( id_auditeur_ integer, ue1_ varchar, ue2_ varchar ) returns boolean
     
    AS $$
    DECLARE
    	validation integer;
     
    BEGIN
     
    	SELECT id_auditeur
    	from inscrire
    	INTO validation
    	WHERE id_auditeur = id_auditeur_ AND note1 >=10 or note2 >=10;
     
    	IF validation IS NULL THEN
    		return false;
    	ELSE 
    		return true;
    	END IF;
     
    END
    $$ LANGUAGE plpgsql;
    quand appel la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select validation2(1, 'NFA001', 'NFA002')
    je vais avoir true

    mais si je fais une requête normal de l'auditeur 1 je vois qu'il n'a pas validé les deux ue que j'ai mis en argument donc je devrais avoir false... vu que le "NFA001 deux notes <10 mais le NFA002 validé une notes>10.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select validation2(1, 'NFA001', 'NFA002')
    Nom : validation.png
Affichages : 54
Taille : 118,4 Ko
    merci et bonne journée

  5. #5
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    mai 2008
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2008
    Messages : 222
    Points : 408
    Points
    408
    Par défaut
    Vous pouvez declarez les paramètres de votre fonction , soit tel que je l'ai fait, sinon comme vous l'avez fait.

    $$ permet de délimiter la définition de votre fonction
    vous pouvez adopter les symboles que vouz voulez.

    Exemple :

    @@@@@
    BEGIN
    ....
    ....
    ....
    END;
    @@@@@

    Pour commencer, votre table ne respecte pas les règles de modéliation des Base de données
    Vous ne devriez pas avoir des colonnes comme ceci note1, note2, note3.....
    Faites plutôt ceci
    inscrire (note_id, id_auditeur, annee, id_uer, note)

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    août 2008
    Messages
    2 885
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 2 885
    Points : 5 684
    Points
    5 684
    Par défaut
    Plusieurs points à aborder :

    1/ Le test concerne 2 UE passées en paramètre, il faut donc les intégrer à la requête and id_ue in (ue1_, ue2_).
    2/ La condition OR nécessite l'utilisation de parenthèse afin de gérer correctement les règles de priorité des opérateurs (d'où le fait que votre test est toujours vrai) : and (note1 >=10 or note2 >=10).
    3/ La clé de la table est sur 3 colonne (id_auditeur, annee, id_ue), il est donc parfaitement possible techniquement que l'auditeur 1 valide l'UE NFA002 plusieurs fois (sur plusieurs années).

    A cause de 3/, il faut donc :
    - soit effectuer le test pour chaque UE : Si l'UE 1 est validée alors, on cherche si l'UE 2 est validée
    - soit en une seule recherche s'assurer que les 2 UE font bien parties des critères de sélection en regardant par exemple la valeur de count(distinct id_ue), si c'est 2 alors les 2 UE ont été validées
    Ensuite soit vous testez directement cette valeur, soit vous l'incluez dans une clause HAVING afin de tester si la requête renvoie quelque chose ou pas.

    Concentrez-vous d'abord sur la requête SQL, puis une fois développée, intégrez la dans la fonction.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Autre
    Inscrit en
    mars 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : mars 2021
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    Tout d'abord je voudrais vraiment vous remercier pour le temps que vous passez à nous aider, d'ailleurs je suis impressionné par vos compétences.
    Concernant la table qui ne respecte pas les règles, je n'ai pas crée cette table mais elle fait partie d'un TD à faire et je ne peux pas la modifier mais je vous remercie pour cette précision.
    Je vais me concentrer comme vous le dites sur la requête, j'ai des difficultés avec les fonctions qui ne sont pas facile à déboguer.
    Encore merci pour vos conseils et aide.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Autre
    Inscrit en
    mars 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : mars 2021
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    j'ai suivi vos conseils et après quelques heures à tester la fonction marche même si peut être qu'il n'y avait pas besoin de jointure.
    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
     
    CREATE FUNCTION validation( id_auditeur_ integer, ue1_ varchar, ue2_ varchar) 
    returns boolean
     
    AS $$
    DECLARE
    	validation integer;
    	b boolean := false;
     
    BEGIN
    select count(distinct s.id_ue)
    from inscrire s
    into validation
    join ue u on s.id_ue = u.id_ue
    where id_auditeur = $1
    and (u.id_ue = $2 or u.id_ue=$3)
    and (note1>=10 or note2 >=10);
     
    IF (validation > 1)  then
    		b:= true;
    	ELSE 
    		b:= false;
    	END IF;
    return b;
    END
    $$ LANGUAGE plpgsql;
    merci

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    août 2008
    Messages
    2 885
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 2 885
    Points : 5 684
    Points
    5 684
    Par défaut
    Effectivement la jointure ne sert à rien.

    Par ailleurs, il est préférable de coder IF (validation = 2), car même si dans le cas présent ça ne change rien (les seules valeurs possibles étant 0, 1 ou 2) mais le jour où il faut faire évoluer la fonction avec 3 uo, alors il faudra tester IF (validation = 3)

  10. #10
    Membre à l'essai
    Homme Profil pro
    Autre
    Inscrit en
    mars 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : mars 2021
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    je vous remercie je vais suivre vos conseils
    bonne journée et encore merci

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

Discussions similaires

  1. aide fonction tri heapsort (création du tas)
    Par Invité dans le forum C
    Réponses: 6
    Dernier message: 24/11/2009, 00h27
  2. Aide fonction getopt
    Par makohsarah dans le forum C
    Réponses: 12
    Dernier message: 12/06/2006, 16h02
  3. aide fonction math[racine,cos(),sin(),..]VB6
    Par am.adnane dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/12/2005, 18h40
  4. appel de fonction pl/pgsql
    Par gballou dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/11/2005, 12h53
  5. besoin d'aide fonction avec fichier (debutant)
    Par boby61 dans le forum Débuter
    Réponses: 9
    Dernier message: 14/03/2005, 11h22

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