Voilà un comportement étrange que j'ai du mal à éclaircir :
Voici un exemple de boucle WHILE dans une fonction PL/PSQL :
Sous cette forme, j'ai bien au retour de ma fonction, les 12 lignes de ma table client qui sont retournées.
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;
Par contre avec ce code:
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).
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;
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:
Là j'ai bien les 11 dernières lignes qui sont retournées.
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;
Merci d'avance pour vos éclaicissements
Partager