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 curseur pl/sql


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Par défaut Problème curseur pl/sql
    salut,
    j'ai l'exercice suivant:
    matiere(code_matiere,designation,coeff)
    etudiant(ncin,nom)
    epreuve(code_matiere,ncin,date_epreuve,note)
    ecrire un bloc pl/sql qui permet d'avoir pour chaque etudiant un releve de notes (la moyenne 1 matiere comporte plusieurs epreuves)
    releve de notes :
    ncin..........nom..............
    designation..................moyenne..............
    moyenne generale............
    recapitulatif :
    moyenne la plus basse............
    moyenne la plus eleve.............

    j'ai écrit le bloc pl/sql suivant :
    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
    declare 
     
    cursor c1 is select * from etudiant ;
    cursor c2(wcodemat matiere.code_matiere%type) is select code_matiere, designation from matiere where code_matiere= wcodemat ;
    cursor c3(wcin etudiant.ncin%type) is select code_matiere, sum(note)/nvl(count(*),1)  from epreuve where ncin = wcin group by code_matiere;
    -- declaration variables
    cpt etudiant%rowtype;
    cpt3 matiere%rowtype;
    cpt2 epreuve%rowtype;
    wmat matiere.code_matiere%type;
    wmati matiere.code_matiere%type;
    wcoeff number;
    moyge number(4,2) :=0 ;
    scoeff number := 0 ;
    maxi number(4,2);
    mini number(4,2);
    moy number(4,2);
    begin
    --set serveroutput on ;
     
    open c1 ;
    for cpt in c1 loop
        dbms_output.put_line('CIN   :'||cpt.ncin||'     nom  :'||cpt.nom);
        open c3(cpt.ncin);
        loop
            fetch c3 into wmati,moy ;
            open c2(wmati);
            fetch c2 into wmat,wcoeff ;
            dbms_output.put_line(wmat||'         Moyenne  :'||moy);
            moyge := moyge + moy ;
            scoeff := scoeff + wcoeff ;
        end loop ;
        dbms_output.put_line('la moyenne generale     :'||moyge/nvl(scoeff,1));
        close c2 ;
        close c3;
        if moyge/scoeff > maxi then maxi := moyge / scoeff ; end if ;
        if moyge/scoeff < mini then mini := moyge / scoeff ; end if ;
    end loop ;
    close c1;
    end;
    /
    et j'ai cette erreur :
    ERREUR à la ligne 1:
    ORA-06511: PL/SQL: curseur déjà ouvert
    ORA-06512: à ligne 2
    ORA-06512: à ligne 20
    j'ai deja essaye avec ce code avant l'ouverture de c1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if c1%isopen then close c1 ; end if ;
    mais isopen est un attribut inconnu (pourtant je l'ai dans mon cours) !!!
    pouvez vous m'aider ??

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Quand tu utilises un boucle for avec un curseur, l'ouverture est implicite
    => pas besoin de faire un open avant.

    Pour une meilleure lisibilité de ton code je te conseille de ne pas mélanger les boucles for et les open ... loop ... fetch ... close. Quand tu le peux utilises les boucles for

  3. #3
    Membre expérimenté Avatar de JerryMouse
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 215
    Par défaut
    Effectivement.
    Dans ton exemple des curseurs implicites auraient été plus simple
    et ton code plus lisible.

Discussions similaires

  1. [2008R2] Problème curseur sql server 2008 r2
    Par kent69003 dans le forum Développement
    Réponses: 2
    Dernier message: 29/04/2015, 09h46
  2. problème curseur pl/sql
    Par guappi dans le forum PL/SQL
    Réponses: 9
    Dernier message: 07/04/2010, 11h12
  3. Problème Curseur SQL SERVER
    Par Yanmeunier dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/12/2005, 19h19
  4. Problème Access to Sql Server
    Par vuldos dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/08/2004, 15h56
  5. Réponses: 3
    Dernier message: 18/11/2002, 16h36

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