SGBD-PL\SQL
(Procedural Language / Structured Query Language)
Chapitre 2 : Les structures de contrôle
(PL\SQL)
Faîçal Felhi
felhi_fayssal@[Link]
I. Structures alternatives
[Link] Conditionnelle : IF
Cette instruction permet de faire des tests conditionnels
Syntaxe :
IF condition1 THEN
séquence;
[ELSIF condition2 THEN
séquence; ]
[ELSIF condition3 THEN
séquence; ]
[ELSE
séquence; ]
END IF;
ELSE et ELSIF : optionnelles
ELSIF : plusieurs
ELSE : une seule
2
I.2. Structure Case
Cette instruction permet de mettre en place des structures de test
conditionnel de type IF .. ELSE .. END IF,
2 syntaxes sont possibles :
[<<étiquette>>]
[<<étiquette>>]
CASE
CASE var
WHEN condition1 THEN instructions1;
WHEN contenu-var THEN instructions1; WHEN condition2 THEN instructions2;
WHEN contenu-var THEN instructions2; …
… WHEN conditionN THEN instructionsN;
WHEN contenu-var THEN instructionsN; [ELSE instructionsN+1;]
END CASE [étiquette];
[ELSE instructionsN+1;]
END CASE [étiquette];
3
Exemple1 :
Declare
V_Num integer := 0 ;
Begin
Loop
V_Num := V_Num + 1 ;
CASE V_Num
WHEN 1 Then dbms_output.put_line( '1' ) ;
WHEN 2 Then dbms_output.put_line( '2' ) ;
WHEN 3 Then dbms_output.put_line( '3' ) ;
ELSE
EXIT ;
END CASE ;
End loop ;
End ;
Résultat :
1
2
3
4
Procédure PL/SQL terminée avec succès.
Exemple2 :
Declare
V_Num integer := 0 ;
Begin
Loop
V_Num := V_Num + 1 ;
CASE
WHEN V_Num between 1 and 3 Then dbms_output.put_line( To_char( V_Num ) || ' -> 1-3' ) ;
WHEN V_Num < 5 Then dbms_output.put_line( To_char( V_Num ) || ' < 5' ) ;
ELSE dbms_output.put_line( To_char( V_Num ) || ' >= 5' ) ;
END CASE ;
EXIT whenV_Num = 5 ;
End loop ;
End ;
Résultat :
1 -> 1-3
2 -> 1-3
3 -> 1-3
4<5
5 >= 5
Procédure PL/SQL terminée avec succès.
5
II. Instructions Répétitives
II.1. La boucle de base : LOOP
[<<étiquette>>]
LOOP Infinie !!!
Séquence;
END LOOP [<<étiquette>>];
Cette syntaxe met en place une boucle simple ou aucune condition de sortie n'est indiquée, il
faut donc une instruction EXIT pour sortir de ce type de boucle:
EXIT [étiquette] [ WHEN condition] ;
Exemple :
Compteur := 0;
LOOP
Compteur := Compteur + 1;
Insert into LIGNE values (Compteur) ;
…
EXIT WHEN Compteur =10;
…
END LOOP;
6
II.2. La boucle WHILE
Syntaxe :
WHILE condition
LOOP
Séquence;
END LOOP;
Cette syntaxe permet de mettre en place une boucle dont la condition de test est évaluée au début.
Si condition donne le résultat FALSE, les instructions suivantes jusqu'au mot clé END LOOP; ne
seront pas exécutées
LOOP et END LOOP jouent le rôle de FAIRE et FIN FAIRE dans une boucle algorithmique TANT
QUE.
Exemple :
Declare
I integer := 0 ;
Begin
While I < 3
Loop
I := I + 1 ;
dbms_output.put_line( to_char( I) ) ;
End loop ;
End ;
Résultat :
1
2
3 7
II.3. La boucle FOR
Cette syntaxe permet de mettre en place une boucle dont le nombre d'itérations est fixé dès
l'entrée
Syntaxe :
FOR indice IN [REVERSE] b_inf..b_sup
LOOP
Séquence;
END LOOP;
Où
Indice :
variable entière déclarée implicitement par la boucle
locale
Référencé dans la boucle seulement
S’incrémente automatiquement de 1 à la fin de chaque itération
8
Exemple 1 : Exemple 2
Declare
Declare I integer := 0 ;
I integer := 0 ; Begin
Begin For i in reverse1..3
For i in 1..3 Loop
Loop dbms_output.put_line( to_char( i ) ) ;
dbms_output.put_line( to_char( i ) ) ; End loop ;
End loop ; End ;
End ;
Résultat: Résultat:
1 3
2 2
3 1
9