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 :

un pivot 'dynamique' pour oracle 10g


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Par défaut un pivot 'dynamique' pour oracle 10g
    Bonjour voila j'ai une table BILAN qui contient différente matiere avec des eleves j'aimerai faire un pivot pour avoir un resultat qui ressemble à çà :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NOM  MATIERE1  MATIERE2  ETC..
    ELEVE1   12            13
    ELEVE2   14            11
    Voici ma procédure stockée pour le moment :

    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 PROCEDURE pivotBilan AS
    v_matiere VARCHAR2(25);
    v_req_deb VARCHAR2(50);
    v_req_fin VARCHAR(50);
    v_req VARCHAR2(300);
    v_req_final VARCHAR(500);
    v_long NUMBER;
    CURSOR monCurseur IS SELECT DISTINCT matiere FROM BILAN ORDER BY matiere
    BEGIN
    	OPEN monCurseur;
    	v_long:=0;
    	v_req_deb := 'SELECT nom,';
    	v_req_fin := 'FROM bilan GROUP BY nom';
    	FETCH monCurseur INTO v_matiere;
    	WHILE(monCurseur%FOUND)
    	LOOP
    		v_req:= CONCAT(v_req, "max(decode(matiere,'"v_matiere"',moyenne)),");
    		FETCH monCurseur INTO v_matiere;
    	END LOOP;
    	CLOSE monCurseur;
    	v_long:=LENGTH(v_req);
    	v_req:=SUBSTR(v_req,v_long-1,0);
    	v_req_final := v_req_deb || v_req || v_req_fin;
    	EXECUTE IMMEDIATE v_req_final;
    END;
    /

    çà me retourne l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ERREUR à la ligne 13 : PLS-00103: Symbole "=" rencontré à la place d'un des symboles suivants :
     
       constant exception 
        table LONG_ double ref char
       time timestamp interval date binary national character nchar
    la ligne 13 est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v_req_fin := 'FROM bilan GROUP BY nom';
    Je vous remercie par avance pour votre aide !

  2. #2
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Bonjour,
    Il y a plusieurs problèmes dans ton code :
    - il manque le ";" à la fin de la déclaration de "monCurseur",
    - à la ligne 17, il faut utiliser des apostrophes et non des doubles quotes ; personnellement je préfère utiliser le double pipe "||" plutôt que la fonction CONCAT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v_req:= v_req || 'max(decode(matiere,''' || v_matiere || ''',moyenne)),';
    Xavier

  3. #3
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Pourquoi faire un PLSQL ici ???


    Il y a une reponse en SQL deja ...

    Quand tu peux le faire en SQL reste en SQL !!!

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Par défaut
    @fatsora : Avec le SQL cela m'oblige à connaitre les matières à l'avance il me semble, je ne connais pas à l'avance les matieres présentent dans ma table BILAN.

    @xdescamp : Merci beaucoup, ma procédure se crée bien grâce à tes corrections.

    Par contre lorsque je la test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BEGIN
    pivotBilan();
    END;
    /
    j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00936: expression absente
    Sais-tu d'ou celà peut venir ?
    Voici ma procédure mise à jour :
    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 PROCEDURE pivotBilan AS
    v_matiere VARCHAR2(25);
    v_req_deb VARCHAR2(50);
    v_req_fin VARCHAR(50);
    v_req VARCHAR2(300);
    v_req_final VARCHAR(500);
    v_long NUMBER;
    CURSOR monCurseur IS SELECT DISTINCT matiere FROM BILAN ORDER BY matiere;
    BEGIN
    	OPEN monCurseur;
    	v_long:=0;
    	v_req_deb := 'SELECT nom,';
    	v_req_fin := 'FROM bilan GROUP BY nom';
    	FETCH monCurseur INTO v_matiere;
    	WHILE(monCurseur%FOUND)
    	LOOP
    		v_req:= v_req || 'max(decode(matiere,''' || v_matiere || ''',moyenne)),';
    		FETCH monCurseur INTO v_matiere;
    	END LOOP;
    	CLOSE monCurseur;
    	v_long:=LENGTH(v_req);
    	v_req:=SUBSTR(v_req,v_long-1,0);
    	v_req_final := v_req_deb || v_req || v_req_fin;
    	EXECUTE IMMEDIATE v_req_final;
    END;
    /

    Merci beaucoup !

  5. #5
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Ce que tu essaies de faire est complique, est-ce vraiment utile ?
    Tu as un nombre de colonne dynamique, ce qui n'est franchement pas commode pour recuperer/manipuler les donnees. Qu'en fais-tu ?
    Le plus simple serait d'eviter PL/SQL, mais d'avoir un petit SQL qui creer un autre script avec toutes les colonnes comme il faut, juste pour un rapport.

    Quant a ton erreur "ORA-00936: expression absente" elle provient de l'"execute immediate", un cauchemar a debugger, et en plus sans clause INTO. Et la on rejoint ce que je disais auparavant, comment va tu faire pour savoir quoi metter dans la clause INTO ? Puisque par definition, tu ne connais pas les colonnes que tu vas recuperer.

    Nicolas.

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Par défaut
    Enfaite, j'ai une table BILAN vide à la base avec comme champs

    NOM, MATIERE, MOYENNE

    Celle-ci je la garni avec une procédure
    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
    42
     
    CREATE OR REPLACE PROCEDURE maProcedure(numeroClasse in NUMBER) AS
    v_nomEleve VARCHAR2(25);
    v_prenomEleve VARCHAR2(25);
    v_libelleMatiere VARCHAR2(25);
    v_MatCourante VARCHAR2(25);
    v_NomCourant VARCHAR2(25);
    v_total NUMBER;
    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=numeroClasse
    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;
    		INSERT INTO BILAN (nom,matiere,moyenne) VALUES (v_NomCourant,v_MatCourante,v_moyenne);
    	END LOOP;
    	CLOSE monCurseur;
    END;
    /
    Donc après cette procédure, ma table bilan contient les moyennes de tous les élèves d'UNE classe passé en paramètre pour chaque matières enseignés à cette classe. (Toutes les classes non pas les mêmes matières enseignés)

    Et ce que j'aimerai faire, c'est d'afficher cette table BILAN en pivot, j'ai donc pensé le faire en PL/SQL mais si il y à une autre je suis à l'écoute.

    Je n'ai pas bien compris ta proposition "petit SQL qui creer un autre script avec toutes les colonnes" pourrais-tu m'en dire plus ?


    Merci à vous !

Discussions similaires

  1. Changement de port d'écoute pour Oracle 10g Express Edition
    Par A D R I A N O dans le forum Installation
    Réponses: 2
    Dernier message: 22/03/2011, 16h07
  2. sqlnavigator pour Oracle 10g
    Par elharet dans le forum Toad
    Réponses: 1
    Dernier message: 07/05/2009, 14h59
  3. Nom et Mot de passe pour Oracle 10g
    Par Stitch78 dans le forum Installation
    Réponses: 1
    Dernier message: 04/11/2007, 18h58
  4. JDBC pour oracle 10g XE
    Par ayoub2010 dans le forum JDBC
    Réponses: 2
    Dernier message: 08/04/2007, 23h18
  5. Forms pour Oracle 10g Release 2
    Par cpointet dans le forum Forms
    Réponses: 1
    Dernier message: 11/10/2005, 07h25

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