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 :

Créer un curseur


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Points : 53
    Points
    53
    Par défaut Créer un curseur
    Bonjour,
    Tout est dans le titre !.

    Je vous explique j'ai élaboré une petite requête me permettant de récupérer : N°étudiant et Moyenne-G !.

    La problématique : Et que je souhaiterais, à l'aide d'un Curseur glisser ce résultat dans une autre table nommé Classement cette table et composé de 3 champs (Numetud, MoyenneG, Rang).
    Cela ne fonctionne pas car je récupére l'erreur suivante :
    ORA-06550: Ligne 16, colonne 80 :
    PLS-00302: Le composant 'RANG' doit être déclaré
    ORA-06550: Ligne 16, colonne 80 :
    PL/SQL: ORA-00984: un nom de colonne n'est pas autorisé ici
    SET SERVEROUTPUT ON;
    DECLARE
    CURSOR C_CursRang IS
    select numetud, sum(noteglobmat * coefficient) / sum(coefficient) As NoteM
    from tpmatiere, tpresultat
    where codematiere = codemat
    group by numetud
    ORDER BY 2 DESC;

    l_Result C_CursRang%ROWTYPE;

    BEGIN
    OPEN C_CursRang;
    LOOP
    FETCH C_CursRang INTO l_Result;
    EXIT WHEN C_CursRang%NOTFOUND;
    INSERT INTO TPCLASSEMENT VALUES(l_Result.numetud,l_Result.NoteM,l_Result.Rang);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('........Insertion terminés avec succés ! ');

    CLOSE C_CursRang;
    END;
    PS : Je pense que je dois déclarer une variable Rang (:=) mais ne sais si on peux faire cela dans un curseur, et encore moins comment faire !

    Merci de votre aide.

  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
    Votre curseur ramène deux colonnes numetud et NoteM donc il vous manque la colonne Rang.
    La première question qui se pose est comment doit-on calculer le rang ? Quelles sont les règles ?

  3. #3
    Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Oui en effet c'est bien cela le problème il manque la colonne Rang.

    Le rang doit est calculé en fonction du résultat retourné par la requête ci-dessous
    select numetud, sum(noteglobmat * coefficient) / sum(coefficient) As NoteM
    from tpmatiere, tpresultat
    where codematiere = codemat
    group by numetud
    ORDER BY 2 DESC;
    Pour les règles... : l'élève ayant obtenu la meilleur note (Moyenne-G) sera classé premier.

    Merci de ton aide.

  4. #4
    Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Merci de m'apporter votre aide sur ce sujet.

    Cordialement,

  5. #5
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Au moins deux possibilités :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select  numetud,
            ,NoteM
            ,rank() over (order by NoteM desc) as RANG
    FROM    (   select  numetud, 
                        sum(noteglobmat * coefficient) / sum(coefficient) As NoteM
                from tpmatiere
                INNER JOIN tpresultat ON codematiere = codemat
                group by numetud
            )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select  numetud, 
    sum(noteglobmat * coefficient) / sum(coefficient) As NoteM,
    rownum as rang
    from tpmatiere
    INNER JOIN tpresultat ON codematiere = codemat
    group by numetud
    order by NoteM desc

  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
    La deuxième est certainement erroné.

  7. #7
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par mnitu Voir le message
    La deuxième est certainement erroné.
    C'est pas faux ^^
    Désolé, j'ai fait ca un peu trop à la va vite


    Je voulais juste mettre en place l'idée du rownum, etant donné qu'il n'y a pas l'air d'y avoir de "partition"



    EDIT : Et au final, rank est quand meme mieux car si deux élèves ont 20, ils seront tous les deux premiers, alors que sinon, un choix est fait "aléatoirement"

  8. #8
    Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Effectivement la solution deux était la bonne !.
    Un grand merci pour ton aide Bstevy.

  9. #9
    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 jelmouss Voir le message
    Effectivement la solution deux était la bonne !.
    ....

  10. #10
    Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Désolé mnitu
    je voulais dire la 1. La solution 1.

  11. #11
    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
    C'est déjà mieux. Maintenant pour nous convaincre que c'est vraiment la "solution" modifiez la requête 1 en remplaçant rank par row_number et une deuxième fois par dense_rank. Obtenez-vous toujours le même résultat ? Sinon comprenez-vous bien les différences ?

  12. #12
    Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    - Alors en remplaçant par row_number :
    Comme on peut le voir ci-dessous, on voit très bien qu'on récupère un numéro par ligne. (Chaque ligne est unique !)
    Nom : row_number.png
Affichages : 650
Taille : 23,2 Ko

    - Concernant dense_rank :
    Je ne vois aucune différence avec la fonction rank utilisé dans mon première exemple. Je récupère absolument le même résultat. (Les lignes 7 & 8 ont le même indice !)
    Nom : dense_rank.png
Affichages : 658
Taille : 23,4 Ko
    Ps : J'ai lu que la fonction dense_rank fonctionne de la même façon de rank, mais ne renvoie pas de "trous". Et comme je n'avais pas de "trou" dans ma fonction rank, c'est sûrement pour ça que je ne vois aucune différence.

    Merci pour cette exercice pratique et utile Mnitu.

    Cordialement Jelmouss.

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par jelmouss Voir le message
    Ps : J'ai lu que la fonction dense_rank fonctionne de la même façon de rank, mais ne renvoie pas de "trous". Et comme je n'avais pas de "trou" dans ma fonction rank, c'est sûrement pour ça que je ne vois aucune différence.
    Absolument, et c'est bien d'avoir eu la curiosité de regarder.
    Il aurait fallu deux trois lignes en plus dans votre jeu de données pour que vous perceviez la différence.
    En cas d'égalité, les fonctions se comportent de la manière suivante :
    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
    with matable as
    (
    select 15 as col from dual union all
    select 15        from dual union all
    select 20        from dual
    )
    select col
         , rank()       over(order by col asc) as rk
         , dense_rank() over(order by col asc) as dr
         , row_number() over(order by col asc) as rn
      from matable;
     
           COL         RK         DR         RN
    ---------- ---------- ---------- ----------
            15          1          1          1 
            15          1          1          2 
            20          3          2          3

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

Discussions similaires

  1. Créer un curseur sous condition
    Par kalurar dans le forum PL/SQL
    Réponses: 5
    Dernier message: 06/07/2011, 13h48
  2. Réponses: 5
    Dernier message: 25/08/2008, 14h28
  3. Créer un curseur personnalisé
    Par Duan dans le forum Débuter
    Réponses: 6
    Dernier message: 19/03/2008, 19h07
  4. Créer des curseurs
    Par Romalafrite dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/01/2007, 16h06

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