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 :

[DEBUTANT] Procedure stockée


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 57
    Points
    57
    Par défaut [DEBUTANT] Procedure stockée
    Bonjours à tous,

    Voilà je débute sous oracle, j'aimerai réaliser la chose suivante :
    J'ai une requete

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select e.nomEleve, e.prenomEleve, n.note, m.libelleMatiere, c.libelleClasse
    from eleves e, notes n, matieres m, evaluations ev, classes c
    where e.numeleve=ev.numeleve
    and n.numnote=ev.numnote
    and m.nummatiere=ev.nummatiere
    and c.numClasse=ev.numClasse
    and c.numClasse=1;

    qui me retourne le resultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    NOMELEVE	PRENOMELEVE	NOTE	LIBELLEMATIERE	LIBELLECLASSE
    ELEVE1      Christophe	18	ECONOMIE-DROIT	BTS IG 2EME ANNEE
    ELEVE2      Eric	19	ECONOMIE-DROIT	BTS IG 2EME ANNEE
    ELEVE2      Eric	12	ECONOMIE-DROIT	BTS IG 2EME ANNEE
    ELEVE1      Christophe	12	ECONOMIE-DROIT	BTS IG 2EME ANNEE
    ELEVE3      Melissa	15	ECONOMIE-DROIT	BTS IG 2EME ANNEE
    ELEVE2      Eric	12	INFORMATIQUE	BTS IG 2EME ANNEE
    ELEVE3      Melissa	19	ECONOMIE-DROIT	BTS IG 2EME ANNEE
    ELEVE2      Eric	20	ECONOMIE-DROIT	BTS IG 2EME ANNEE
    ELEVE2      Eric	12	ECONOMIE-DROIT	BTS IG 2EME ANNEE
    Je met donc ceci dans un curseur, mais maintenant j'aimerai faire le traitement suivant

    Pour chaque eleve faire la moyenne de chaque matiere

    J'aimerai donc un resultat qui ressemblerai à çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NOMELEVE	PRENOMELEVE	ECO   INFO
    ELEVE1      Christophe	        11	13
    ELEVE2      Eric	                12	13
    ELEVE3      Melissa	        14     13
    Mais je ne sais pas du tout comment procéder.
    Je vous remercie d'avance !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Voici un peu de lecture, ce sera sans doute plus efficaces que mes explications : http://sqlpro.developpez.com/cours/sqlaz/ensembles/
    Dans votre cas, vous pouvez essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT e.nomEleve, e.prenomEleve, avg(n.note) AS Moyenne, m.libelleMatiere, c.libelleClasse
    FROM eleves e
    JOIN evaluations ev
    	 ON e.numeleve=ev.numeleve
    JOIN notes n
    	 ON n.numnote=ev.numnote
    JOIN matieres m
    	 ON m.nummatiere=ev.nummatiere
    JOIN classes c
    	 ON c.numClasse=ev.numClasse
    WHERE c.numClasse=1
    GROUP BY e.nomEleve, e.prenomEleve, m.libelleMatiere, c.libelleClasse;
    EDIT : Je précise, au cas où vous ne connaitriez pas cette ecriture des jointures, qu'il s'agit de la norme.
    Comme vous débutez, un autre lien pour la route
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    A l'évidence, vous pouvez faire cela en une requête. Une procédure stockée est inutile ici.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Voici un peu de lecture, ce sera sans doute plus efficaces que mes explications : http://sqlpro.developpez.com/cours/sqlaz/ensembles/
    Dans votre cas, vous pouvez essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT e.nomEleve, e.prenomEleve, avg(n.note) AS Moyenne, m.libelleMatiere, c.libelleClasse
    FROM eleves e
    JOIN evaluations ev
    	 ON e.numeleve=ev.numeleve
    JOIN notes n
    	 ON n.numnote=ev.numnote
    JOIN matieres m
    	 ON m.nummatiere=ev.nummatiere
    JOIN classes c
    	 ON c.numClasse=ev.numClasse
    WHERE c.numClasse=1
    GROUP BY e.nomEleve, e.prenomEleve, m.libelleMatiere, c.libelleClasse;
    EDIT : Je précise, au cas où vous ne connaitriez pas cette ecriture des jointures, qu'il s'agit de la norme.
    Comme vous débutez, un autre lien pour la route
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

    Merci de ton aide ! Mais le résultat obtenue avec ta requête n'est pas le résultat souhaité ! en effet je souhaiterai que chaque libelleMatiere se présent dans mon curseur se transforme en une colonne pour par la suite avoir toutes les informations d'un élève sur une seul ligne

    comme ceci :

    ELEVE MATHS INFO ECO
    unEleve 17 13 12

    Et non:

    ELEVE moyenne libelleMatiere
    unEleve 17 MATHS
    unEleve 13 INFO
    unEleve 12 ECO


    C'est pourquoi je souhaite passer par une procédure stockée, dans un premier temps je capte toute les notes d'un élève pour chaque matiere

    Et ensuite je veux calculer la moyenne pour chaque matiere et mettre en forme comme dit précédemment.

    Citation Envoyé par GoLDoZ Voir le message
    A l'évidence, vous pouvez faire cela en une requête. Une procédure stockée est inutile ici.
    Je n'ai pas réussi à faire ceci en une simple requête, de plus dans le cadre de mes études il faut utilisé une procédure stockée...


    Je vous remercie de votre aide !

  5. #5
    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
    Citation Envoyé par erigoal Voir le message
    ...en effet je souhaiterai que chaque libelleMatiere se présent dans mon curseur se transforme en une colonne pour par la suite avoir toutes les informations d'un élève sur une seul ligne

    comme ceci :

    ELEVE MATHS INFO ECO
    unEleve 17 13 12

    Et non:

    ELEVE moyenne libelleMatiere
    unEleve 17 MATHS
    unEleve 13 INFO
    unEleve 12 ECO

    ...
    Cherchez pivot sur ce site dans SQL ou PL/SQL.

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    En PL/SQL, un peu de logique suffit. Vous ordonnez votre curseur par élève, et tant que les enregistrements concernent cet élève, vous concaténez les autres données dans une autre variable ou dans un tableau.
    Ceci n'est qu'un exemple.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 57
    Points
    57
    Par défaut
    Voilà j'ai fait ma procedure stockée la creation se passe sans encombres

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    CREATE OR REPLACE PROCEDURE maProcedure AS
    v_nomEleve VARCHAR2(25);
    v_libelleMatiere VARCHAR2(25);
    v_MatCourante VARCHAR2(25);
    v_NomCourant VARCHAR2(25);
    v_total NUMBER(4,2);
    v_moyenne NUMBER(4,2);
    v_nbr NUMBER;
    v_note NUMBER;
    CURSOR monCurseur 
    IS SELECT e.nomEleve, n.note, m.libelleMatiere
    FROM eleves e, notes n, matieres m, evaluations ev, classes c
    WHERE e.numeleve=ev.numeleve
    AND n.numnote=ev.numnote
    AND m.nummatiere=ev.nummatiere
    AND c.numClasse=ev.numClasse
    AND c.numClasse=1
    ORDER BY e.nomEleve, m.libelleMatiere ASC;
    BEGIN
    	OPEN monCurseur;
    	v_nbr:=0;
    	v_total:=0;
    	v_note:=0;
    	FETCH monCurseur INTO v_nomEleve, v_note, v_libelleMatiere;
    	WHILE (monCurseur%FOUND)
    	LOOP
    		v_MatCourante:=v_libelleMatiere;
    		v_NomCourant:=v_nomEleve;
    		WHILE((monCurseur%FOUND)AND(v_MatCourante=v_libelleMatiere)AND(v_NomCourant=v_nomEleve))
    		LOOP
    			v_nbr:=v_nbr+1;
    			v_total:=v_total+v_note;
    			fetch monCurseur INTO v_nomEleve, v_note, v_libelleMatiere;
    		END LOOP;
    		v_moyenne:=v_total/v_nbr;
    		EXECUTE IMMEDIATE 'INSERT INTO BILAN (nom,matiere,moyenne) VALUES (v_NomCourant,v_NomCourant,v_moyenne)';
    	END LOOP;
    	CLOSE monCurseur;
    END;
    /
    Parcontre quand je souhaite la tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BEGIN
    maProcedure();
    end;
    J'ai ce message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORA-00984: Un nom de colonne n'est pas autorisé ici
    Et je n'arrive pas à trouver l'erreur...

    Voici ma table bilan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    NOM	VARCHAR2(25)	No	 - 	 -
    MATIERE	VARCHAR2(25)	No	- 	-
    MOYENNE	VARCHAR2(25)	No	- 	-
    Je vous remercie d'avance



    EDIT : Probleme RESOLU, des petites erreurs je vous remercie beaucoup.
    Merci.

  8. #8
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    Essaye de mettre ta requete dans une variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete :=  'INSERT INTO BILAN (nom,matiere,moyenne) VALUES (' || v_NomCourant || ',' || v_NomCourant || ',' || v_moyenne || ')';
    Et après essaye le EXECUTE IMMEDIATE sur ta variable "requete"

    PS: Tu as mis deux fois v_NomCourant dans les valeurs de ta clause INSERT, je suppose que tu voulais mettre v_MatCourante.
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

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

Discussions similaires

  1. debutant procedure stockée
    Par nawal106 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 23/10/2006, 10h06
  2. [TSQL][ASE]debutant procedure stocké
    Par agougeon dans le forum Sybase
    Réponses: 6
    Dernier message: 17/07/2006, 08h53
  3. Réponses: 2
    Dernier message: 31/08/2004, 11h45
  4. [DEBUTANT]Procedure stocké
    Par FreshVic dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 12/07/2004, 12h41
  5. [Debutant][SQL] Execution de procedures stockées
    Par Yannos94 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 18h09

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