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

PL/SQL Oracle Discussion :

Problème d'affichage d'une fonction PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problème d'affichage d'une fonction PL/SQL
    Bonjour à tous,
    Etant nouveau dans le domaine de la programmation PL/SQL, j'aurais besoin de vos lumières.

    Voici mon code :

    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
    CREATE OR REPLACE FUNCTION moyenneEtudiantModule(p_etudiant IN Etudiants.idEtudiant%TYPE, p_idModule IN Modules.idModule%TYPE) RETURN NUMBER
    IS
    moyenne NUMBER;
    moyenne_note NUMBER;
    moyenne_coefficient NUMBER;
     
    BEGIN 
    DBMS_OUTPUT.ENABLE;
     
    FOR m IN(SELECT Ma.coefficientMatiere,N.note INTO moyenne_coefficient, moyenne_note
    FROM Modules M, Matieres Ma, Etudiants E, Notes N
    WHERE M.idModule = Ma.idModule
    AND Ma.idMatiere = N.idMatiere
    AND N.idEtudiant = E.idEtudiant
    AND E.idEtudiant = p_etudiant
    AND M.idModule = p_idModule)
     
    LOOP
     
    moyenne := moyenne + (moyenne_coefficient*moyenne_note);
     
    END LOOP;
     
    moyenne := moyenne / moyenne_coefficient;
    RETURN (moyenne);
     
    END;

    Ensuite j'exécute ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT moyenneEtudiantModule('E6', 'M112')
    FROM DUAL;
    Mais la, rien ne se produit.
    Normalement la moyenne devrait s'afficher, mais rien ne se passe. Ma requête SQL m'affiche bien 2 colonnes avec les notes des matières et leurs coefficients donc je ne vois pas d'où peut venir le problème.

    Merci d'avance.

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Quel est le résultat de l'opération suivante

  3. #3
    Candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci de votre réponse,

    Selon moi, cela donne NULL mais je ne vois pas trop ce qui pourrait être considéré comme NULL dans mon code.

    Edit : je viens d'initialiser mes variables à 0 mais cela ne m'affiche toujours pas le résultat attendu.

  4. #4
    Candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Désolé pour le double message,

    j'ai réussi à régler mon erreur en initialisant à zéro et en changeant un petit peu mon code :

    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 OR REPLACE FUNCTION moyenneEtudiantModule(p_etudiant IN Etudiants.idEtudiant%TYPE, p_idModule IN Modules.idModule%TYPE) RETURN NUMBER
    IS
    moyenne NUMBER:=0;
    cpt_coeff NUMBER :=0;
     
    BEGIN 
    DBMS_OUTPUT.ENABLE;
     
    FOR m IN(SELECT Ma.coefficientMatiere,N.note
    FROM Modules M, Matieres Ma, Etudiants E, Notes N
    WHERE M.idModule = Ma.idModule
    AND Ma.idMatiere = N.idMatiere
    AND N.idEtudiant = E.idEtudiant
    AND E.idEtudiant = p_etudiant
    AND M.idModule = p_idModule)
     
    LOOP
    moyenne := moyenne + (m.coefficientMatiere*m.note);
    cpt_coeff := cpt_coeff + m.coefficientMatiere;
    END LOOP;
     
    moyenne := moyenne / cpt_coeff;
     
    RETURN (moyenne);
     
    END;

    Encore merci !

  5. #5
    Modérateur

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

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il y a bien plus simple : le curseur est inutile, il suffit de faire une requête comme celle-ci (j'ai au passage normalisé les jointures, votre prof pourrait peut être se mettre à jour...)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
    	SUM(Ma.coefficientMatiere * N.note) / SUM(Ma.coefficientMatiere) AS Moyenne
    FROM Etudiants E
    INNER JOIN Notes N
    	ON	N.idEtudiant = E.idEtudiant
    INNER JOIN Matieres Ma
    	ON	Ma.idMatiere = N.idMatiere
    INNER JOIN Modules M
    	ON	M.idModule = Ma.idModule
    WHERE	E.idEtudiant = p_etudiant
    AND		M.idModule = p_idModule

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    D'autre part quand vous analysez votre code vous constatez que vous calculez Somme(m.coefficientMatiere*m.note) divisez par Somme(m.coefficientMatiere). Or SQL est très performant dans ces types de calcul et la boucle en PL/SQL c'est juste une manière moins efficace de faire la même chose. Essayez de récrire votre fonction sans la boucle!

  7. #7
    Candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci de vos réponses, je vais essayer de refaire le programme sans la boucle

    Encore merci !

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

Discussions similaires

  1. Problème d'affichage d'une requête SQL dans un tableau
    Par seremei dans le forum Collection et Stream
    Réponses: 22
    Dernier message: 05/03/2012, 21h52
  2. Problème dans une fonction PL/SQL
    Par jnayna86 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 19/04/2008, 13h28
  3. problème appel à une fonction pl/sql
    Par tommey dans le forum Langage
    Réponses: 3
    Dernier message: 07/08/2007, 14h19
  4. Réponses: 1
    Dernier message: 13/12/2006, 14h18
  5. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50

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