Voilà un comportement étrange que j'ai du mal à éclaircir :

Voici un exemple de boucle WHILE dans une fonction PL/PSQL :

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
 
 
DELCARE
 
curseur CURSOR FOR SELECT *
FROM client;
 
ligne RECORD;
 
BEGIN
 
open curseur;
 
FETCH curseur INTO ligne;
 
WHILE FOUND LOOP
 
RETURN NEXT ligne;
UPDATE client SET nom = 'Dupont'
WHERE nom = 'Durnad';
 
FETCH curseur INTO ligne;
 
END LOOP;
 
close curseur;
 
RETURN;
END;
Sous cette forme, j'ai bien au retour de ma fonction, les 12 lignes de ma table client qui sont retournées.

Par contre avec ce code:

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
 
 
DELCARE
 
curseur CURSOR FOR SELECT *
FROM client;
 
ligne RECORD;
 
BEGIN
 
open curseur;
 
FETCH curseur INTO ligne;
 
WHILE FOUND LOOP
 
FETCH curseur INTO ligne;
 
RETURN NEXT ligne;
UPDATE client SET nom = 'Dupont'
WHERE nom = 'Durnad';
 
END LOOP;
 
close curseur;
 
RETURN;
END;
En mettant donc le FETCH directement après le WHILE, je n'ai plus qu'une ligne en sortie (la deuxième de la table).
La première ligne est zappée, c'est normal avec le premier FETCH se trouvant avant le WHILE, mais pourquoi après le programme sort de la boucle et les 10 autres lignes ne sont pas retournées ?
Pour quel raison FOUND est passé à FALSE ?

Par contre, si j'enlève le UPDATE comme ça:
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
 
 
DELCARE
 
curseur CURSOR FOR SELECT *
FROM client;
 
ligne RECORD;
 
BEGIN
 
open curseur;
 
FETCH curseur INTO ligne;
 
WHILE FOUND LOOP
 
FETCH curseur INTO ligne;
 
RETURN NEXT ligne;
 
END LOOP;
 
close curseur;
 
RETURN;
END;
Là j'ai bien les 11 dernières lignes qui sont retournées.

Merci d'avance pour vos éclaicissements