Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/01/2012, 10h59   #1
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Par défaut Occurrence dans une boucle

Bonjour,
Je suis sous Oracle 8i et travaille avec des curseurs.

Comment savoir qu'on est sur la dernière occurrence de la boucle ?

J'avais eu le même problème pour la première occurrence que j'avais contourné par un compteur.
Mais là j'avoue je sèche complétement, malgré mes recherches je n'ai pas trouvé comment faire.

Merci pour ceux qui vondront bien m'aider...
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 12h09   #2
Rédacteur
 
Inscription : décembre 2002
Messages : 2 389
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 389
Points : 3 276
Points : 3 276
C'est le %ROWCOUNT qui peut vous fournir l'information, tant que le curseur n'est pas fermé. On quitte quand il n'y a plus de lignes (%NOTFOUND), et on regarde le compteur.

Je pense que ce code fonctionne aussi en 8i.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SET serveroutput ON
 
declare
    cursor c_emp IS SELECT * FROM scott.emp ORDER BY ename;
    v_emp c_emp%rowtype;
begin
    open c_emp;
    loop
        fetch c_emp INTO v_emp;
        exit when c_emp%notfound;
        dbms_output.put_line(v_emp.ename);
    end loop;
    dbms_output.put_line('Il y a ' || c_emp%rowcount || ' lignes');
    close c_emp;
end;
/
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 12h25   #3
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Ok merci beaucoup, j'avais pas pensé à cette solution.
Je teste ça avant de mettre
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 11h59   #4
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Bon alors j'ai trouvé encore plus simple :
Normalement si je place mon traitement après la boucle alors mes variables ont gardées les données du dernier enregistrement de mon curseur.

Code :
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
OPEN C_(v_4);
 LOOP
  FETCH C_ INTO v_1, v_2, v_3;
 
   v_occ := v_occ + 1;
 
   -- pas d'occurrences
   IF (C_%NOTFOUND OR C_%NOTFOUND IS NULL) THEN
 
    INSERT INTO MaTable VALUES MesDonnes;
 
   END IF;
 
   EXIT WHEN C_%NOTFOUND OR C_%NOTFOUND IS NULL; 
 
   -- 1ere occurrence 
   IF (v_occ = 1) THEN
 
    INSERT INTO MaTable VALUES MesDonnes;
 
   END IF;
 
 END LOOP;
 
 -- dernière occurrence
 IF (v_3 < v_5) THEN
 
  INSERT INTO MaTable VALUES MesDonnes;
 
 END IF;
 
CLOSE C_;
Après quelques tests cela me semble bon mais si vous avez des remarques n'hesitez pas
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h52.


 
 
 
 
Partenaires

Hébergement Web