Vous êtes sur la page 1sur 18

5

Ecrire des structures de contrôle

Objectifs

A la fin de ce TP, vous pourrez :


• identifier les types de structure de contrôle et leurs
utilisations
• écrire une instruction IF
• utiliser des instructions CASE et des expressions CASE
• écrire et identifier différents types d'instruction de boucle
• appliquer les règles d'utilisation des structures de contrôle
conditionnel

5-2

1
Contrôler le flux d'exécution

for
loop

while

5-3

Contenu du chapitre

• Utiliser des instructions IF


• Utiliser des instructions CASE et des expressions CASE
• Ecrire et identifier différents types d'instruction de boucle

5-4

2
Instruction IF

Syntaxe :
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;

5-5

Instruction IF simple

DECLARE
v_myage number:=31;
BEGIN
IF v_myage < 11
THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
END IF;
END;
/

5-6

3
Instruction IF THEN ELSE

DECLARE
v_myage number:=31;
BEGIN
IF v_myage < 11
THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSE
DBMS_OUTPUT.PUT_LINE(' I am not a child ');
END IF;
END;
/

5-7

Clause IF ELSIF ELSE

DECLARE
v_myage number:=31;
BEGIN
IF v_myage < 11 THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSIF v_myage < 20 THEN
DBMS_OUTPUT.PUT_LINE(' I am young ');
ELSIF v_myage < 30 THEN
DBMS_OUTPUT.PUT_LINE(' I am in my twenties');
ELSIF v_myage < 40 THEN
DBMS_OUTPUT.PUT_LINE(' I am in my thirties');
ELSE
DBMS_OUTPUT.PUT_LINE(' I am always young ');
END IF;
END;
/

5-8

4
Valeur NULL dans une instruction IF

DECLARE
v_myage number;
BEGIN
IF v_myage < 11 THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSE
DBMS_OUTPUT.PUT_LINE(' I am not a child ');
END IF;
END;
/

5-9

Contenu du chapitre

• Utiliser des instructions IF


• Utiliser des instructions CASE et des expressions CASE
• Ecrire et identifier différents types d'instruction de boucle

5 - 10

5
Expressions CASE

• Une expression CASE sélectionne un résultat et le renvoie.


• Pour sélectionner le résultat, l'expression CASE utilise des
expressions. La valeur renvoyée par ces expressions est
utilisée pour sélectionner une ou plusieurs alternatives.

CASE selector
WHEN expression1 THEN result1
WHEN expression2 THEN result2
...
WHEN expressionN THEN resultN
[ELSE resultN+1]
END;

5 - 11

Expressions CASE : Exemple

SET VERIFY OFF


DECLARE
v_grade CHAR(1) := UPPER('&grade');
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal := CASE v_grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade: '|| v_grade || '
Appraisal ' || v_appraisal);
END;
/

5 - 12

6
Expressions de recherche pour la clause CASE

DECLARE
v_grade CHAR(1) := UPPER('&grade');
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal := CASE
WHEN v_grade = 'A' THEN 'Excellent'
WHEN v_grade IN ('B','C') THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade: '|| v_grade || '
Appraisal ' || v_appraisal);
END;
/

5 - 13

Instruction CASE
DECLARE
v_deptid NUMBER;
v_deptname VARCHAR2(20);
v_emps NUMBER;
v_mngid NUMBER:= 108;
BEGIN
CASE v_mngid
WHEN 108 THEN
SELECT department_id, department_name
INTO v_deptid, v_deptname FROM departments
WHERE manager_id=108;
SELECT count(*) INTO v_emps FROM employees
WHERE department_id=v_deptid;
WHEN 200 THEN
...
END CASE;
DBMS_OUTPUT.PUT_LINE ('You are working in the '|| v_deptname||
' department. There are '||v_emps ||' employees in this
department');
END;
/

5 - 14

7
Traiter les valeurs NULL

Lorsque vous utilisez des valeurs NULL, vous pouvez éviter


certaines erreurs fréquentes en gardant à l'esprit les règles
suivantes :
• Les comparaisons simples impliquant des valeurs NULL
renvoient toujours NULL.
• L'application de l'opérateur logique NOT à une valeur NULL
renvoie NULL.
• Si la condition renvoie NULL dans les instructions de
contrôle conditionnelles, la séquence d'instructions
associée n'est pas exécutée.

5 - 15

Tables logiques

Créer une condition booléenne simple avec un opérateur de


comparaison

AND TRUE FALSE NULL OR TRUE FALSE NULL NOT

TRUE TRUE FALSE NULL TRUE TRUE TRUE TRUE TRUE FALSE

FALSE FALSE FALSE FALSE FALSE TRUE FALSE NULL FALSE TRUE

NULL NULL FALSE NULL NULL TRUE NULL NULL NULL NULL

5 - 16

8
Expressions booléennes ou expression logique ?

Quelle est la valeur de flag dans chaque cas ?


flag := reorder_flag AND available_flag;

REORDER_FLAG AVAILABLE_FLAG FLAG

TRUE TRUE ? (1)

TRUE FALSE ? (2)

NULL TRUE ? (3)

NULL FALSE ? (4)

5 - 17

Contenu du chapitre

• Utiliser des instructions IF


• Utiliser des instructions CASE et des expressions CASE
• Ecrire et identifier différents types d'instruction de boucle

5 - 18

9
Contrôle d'itération : Instructions LOOP

• Les boucles permettent d'exécuter plusieurs fois une


instruction (ou une séquence d'instructions).
• Il existe trois types de boucle :
– Boucle de base
– Boucle FOR
– Boucle WHILE

5 - 19

Boucles de base

Syntaxe :
LOOP
statement1;
. . .
EXIT [WHEN condition];
END LOOP;

5 - 20

10
Boucle de base : Exemple

DECLARE
v_countryid locations.country_id%TYPE := 'CA';
v_loc_id locations.location_id%TYPE;
v_counter NUMBER(2) := 1;
v_new_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id) INTO v_loc_id FROM locations
WHERE country_id = v_countryid;
LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((v_loc_id + v_counter), v_new_city, v_countryid);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 3;
END LOOP;
END;
/

5 - 21

Boucles WHILE

Syntaxe :

WHILE condition LOOP


statement1;
statement2;
. . .
END LOOP;

Utilisez une boucle WHILE pour répéter des instructions tant


qu'une condition renvoie TRUE.

5 - 22

11
Boucles WHILE : Exemple

DECLARE
v_countryid locations.country_id%TYPE := 'CA';
v_loc_id locations.location_id%TYPE;
v_new_city locations.city%TYPE := 'Montreal';
v_counter NUMBER := 1;
BEGIN
SELECT MAX(location_id) INTO v_loc_id FROM locations
WHERE country_id = v_countryid;
WHILE v_counter <= 3 LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((v_loc_id + v_counter), v_new_city, v_countryid);
v_counter := v_counter + 1;
END LOOP;
END;
/

5 - 23

Boucles FOR

• Utilisez une boucle FOR pour simplifier le contrôle du


nombre d'itérations.
• Ne déclarez pas le compteur (sa déclaration est implicite).
FOR counter IN [REVERSE]
lower_bound..upper_bound LOOP
statement1;
statement2;
. . .
END LOOP;

5 - 24

12
Boucles FOR : Exemple

DECLARE
v_countryid locations.country_id%TYPE := 'CA';
v_loc_id locations.location_id%TYPE;
v_new_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id) INTO v_loc_id
FROM locations
WHERE country_id = v_countryid;
FOR i IN 1..3 LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((v_loc_id + i), v_new_city, v_countryid );
END LOOP;
END;
/

5 - 25

Règles relatives aux boucles FOR

• Ne référencez le compteur qu'à l'intérieur de la boucle.


Il n'est pas défini en dehors.
• Ne référencez pas le compteur en tant que cible d'une
affectation.
• Aucune limite de boucle ne doit être NULL.

5 - 26

13
Suggestion d'utilisation des boucles

• Utilisez une boucle de base si les instructions doivent


s'exécuter au moins une fois.
• Utilisez une boucle WHILE si la condition doit être évaluée
au début de chaque itération.
• Utilisez une boucle FOR si le nombre d'itérations est connu.

5 - 27

Boucles imbriquées et étiquettes

• Vous pouvez imbriquer des boucles à plusieurs niveaux.


• Utilisez des étiquettes pour différencier les blocs des
boucles.
• Quittez la boucle externe en utilisant l'instruction EXIT qui
référence l'étiquette.

5 - 28

14
Boucles imbriquées et étiquettes : Exemple

...
BEGIN
<<Outer_loop>>
LOOP
v_counter := v_counter+1;
EXIT WHEN v_counter>10;
<<Inner_loop>>
LOOP
...
EXIT Outer_loop WHEN total_done = 'YES';
-- Leave both loops
EXIT WHEN inner_done = 'YES';
-- Leave inner loop only
...
END LOOP Inner_loop;
...
END LOOP Outer_loop;
END;
/

5 - 29

Instruction PL/SQL CONTINUE


• Définition
– Ajoute la fonctionnalité consistant à commencer l'itération
de boucle suivante
– Permet aux programmeurs de transférer le contrôle à
l'itération suivante d'une boucle
– Utilise une structure et une sémantique parallèles à celles
de l'instruction EXIT
• Avantages
– Facilite le processus de programmation
– Peut entraîner une légère amélioration des performances
par rapport aux solutions de contournement précédentes
simulant l'instruction CONTINUE

5 - 30

15
Instruction PL/SQL CONTINUE : Exemple 1

DECLARE
v_total SIMPLE_INTEGER := 0;
BEGIN
FOR i IN 1..10 LOOP
1 v_total := v_total + i;
dbms_output.put_line
('Total is: '|| v_total);
CONTINUE WHEN i > 5;
v_total := v_total + i;
2 dbms_output.put_line
('Out of Loop Total is:
'|| v_total);
END LOOP;
END;
/

5 - 31

Instruction PL/SQL CONTINUE : Exemple 2


DECLARE
v_total NUMBER := 0;
BEGIN
<<BeforeTopLoop>>
FOR i IN 1..10 LOOP
v_total := v_total + 1;
dbms_output.put_line
('Total is: ' || v_total);
FOR j IN 1..10 LOOP
CONTINUE BeforeTopLoop WHEN i + j > 5;
v_total := v_total + 1;
END LOOP;
END LOOP;
END two_loop;

5 - 32

16
Quiz

Il existe trois types de boucle : boucles de base, boucles FOR et


boucles WHILE.
a. Vrai
b. Faux

5 - 33

Synthèse

Ce TP vous a permis d'apprendre à modifier le flux logique des


instructions en utilisant les structures de contrôle suivantes :
• Conditions (instruction IF)
• Expressions CASE et instructions CASE
• Boucles :
– Boucle de base
– Boucle FOR
– Boucle WHILE
• Instruction EXIT
• Instruction CONTINUE

5 - 34

17
Exercices

Dans ces exercices, vous allez exécuter des instructions


itératives en utilisant les boocles

1. Ecrire un bloc permettant d’afficher les 10 premiers entiers


naturels en utilisant l’instruction Loop.

2. Reprendre l’exercice 1 en utilisant l’instruction While.

3. Reprendre l’exercice 1 en utilisant l’instruction For.

4. Reprendre l’exercice 3 en faisant un affichage inversé.

5 - 35

Exercices
Donner le résultat du bloc suivant :
Declare
I Integer := 0 ; J Integer := 0 ;
Begin
Loop
I := I + 1 ;
Loop
J := J + 1 ;
dbms_output.put_line (to_char (I) || ',' || to_char (J)) ;
EXIT WHEN J > 4 ;
End loop ;
EXIT WHEN I > 1 ;
End loop ;
End ;
5 - 36

18