Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Putem schimba fluxul logic al instructiunilor dintr-un bloc PL/SQL utilizand structurile de control IF si structurile de control ciclice. Sunt trei forme ale instructiunii IF:
IF-THEN-END IF
IF-THEN-ELSE-END IF
IF-THEN-ELSIF-END IF
Structura instructiuni IF in PL/SQL este similara cu structura instructiuni IF din alte limbaje procedurale.
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
unde:
condition este o variabila booleana sau expresie (TRUE, FALSE sau NULL). Ea este asociata cu o secventa de instructiuni, ce sunt executate numai daca valoarea expresiei este TRUE.
statements poate fi una sau mai multe instructiuni PL/SQL sau SQL.
ELSIF este un cuvant cheie care introduce o expresie booleana. Daca prima conditie este FALSE sau NULL atunci ELSIF introduce o conditie aditionala.
ELSE este un cuvant cheie care daca controlul ajunge la el, secventa instructiunilor ce ii urmeaza sunt executate.
Instructiunile IF incuibate pot fi realizate prin includerea dupa clauza ELSE a unei noi instructiuni IF astfel:
IF condition1 THEN
statement1;
ELSE
IF condition2 THEN
statement2;
END IF;
END IF;
Exemplu:
IF v_ename = 'KING' THEN
v_job := 'MANAGER';
ELSE
v_job := 'CLERK';
END IF;
Fluxul de executie al instructiuni IF-THEN-ELSIF:
Fig. 0‑
Exemplu:
IF :dept.deptno = 10 THEN
v_comm := 5000;
ELSEIF :dept.deptno = 20 THEN
v_comm := 7500;
ELSE
v_comm := 2000;
END IF;
.
Cand este posibil, putem folosi clauza ELSIF in schimbul instructiunilor IF incuibate, astfel incat codul este mai usor de citit si de inteles.
Exemplu:
IF condition1 THEN
statement1;
ELSIF condition2 THEN
statement2;
ELSIF condition3 THEN
statement3;
END IF;
Instructiunile ciclice repeta o instructiune sau o secventa de instructiuni de mai multe ori. Exista trei instructiuni ciclice LOOP, FOR si WHILE.
Sintaxa instructiuni LOOP este:
LOOP
statement1;
.
EXIT [WHEN condition];
END LOOP;
unde:
condition este o variabila booleana sau o expresie (TRUE, FALSE sau NULL).
Putem termina o bucla LOOP folosind instructiunea EXIT, controlul trecand la urmatoarea instructiune dupa END LOOP. Putem atasa o clauza WHEN pentru a permite terminarea conditionata a instructiunii LOOP. Cand este intalnita instructiunea EXIT , conditia din clauza WHEN este evaluata. Daca conditia este TRUE bucla LOOP se termina si controlul este trecut la urmatoarea instructiune.
Exemplu:
DECLARE
v_ordid item.ordid%TYPE := 101;
v_counter NUMBER(2) := 1;
BEGIN
INSERT INTO item(ordid, itemid)
VALUES(v_ordid, v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
END LOOP;
END;
Exemplul de mai sus insereaza 10 noi linii incepand cu numarul de ordine 101.
Instructiunea
FOR are structura generala asemanatoare cu instructiunea
fundamentala
FOR counter IN [REVERSE]
lower_bound .. upper_bound LOOP
statement1;
statement2;
.
END LOOP;
unde:
counter este o variabila contor a carei valoare se incrementeaza sau se decrementeaza (daca specificam REVERSE) cu 1 la fiecare iteratie a buclei pana cand e depasit intervalul.
REVERSE cauzeaza decrementarea variabilei contor cu fiecare iteratie, de la valoarea superiora la valoarea inferioara.
lower_bound specifica marginea inferioara a intervalului.
upper_bound specifica marginea superioara a intervalului.
Exemplu:
DECLARE
v_lower NUMBER := 1;
v_upper NUMBER := 100;
BEGIN
FOR i IN v_lower .. v_upper LOOP
.
END LOOP;
END;
Instructiunea WHILE este folosita la repetarea unor secvente de instructiuni pana cand conditia logica nu mai are valoarea TRUE. Conditia este evaluata la inceputul fiecarei iteratii, daca conditia este FALSE inca de la inceputul buclei, atunci nu se executa nici o iteratie. Sintaxa instructiunii WHILE este:
WHILE condition LOOP
statement1;
statement2;
.
END LOOP;
unde:
condition este o variabila booleana sau o expresie (TRUE, FALSE sau NULL).
statement poate fi una sau mai multe instructiuni PL/SQL sau SQL.
Exemplu:
ACCEPT p_price PROMPT 'Introduceti pretul unui produs: '
ACCEPT p_itemtot PROMPT 'Introduceti pretul maxim de cumparare al unui produs '
DECLARE
v_qty NUMBER(8) := 1;
v_running_total NUMBER(7,2) := 0;
BEGIN
.
WHILE v_running_total < &p_itemtot LOOP
.
v_qty := v_qty + 1;
v_running_total := v_qty * &p_price;
END LOOP;
Putem incuiba bucle la nivele multiple. De asemenea, putem incuiba bucle FOR intr-o bucla WHILE si invers, iar buclele pot fi etichetate si se poate iesi din bucla cu declaratia EXIT. Numele etichetei urmeaza aceleasi reguli ca si identificatorii. O eticheta este plasata inaintea instructiuni fie pe aceeasi linie sau pe o linie separata. Ca de exemplu, plasarea ei inaintea cuvantului LOOP intre delimitatori (<<label>>). Daca bucla este etichetata, numele etichetei poate fi inclusa optional dupa declaratia END LOOP.
Exemplu:
.
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 iner_done = 'YES';
-- Leave inner loop only
END LOOP Inner_loop;
.
END LOOP Outer_loop;
END;
Copyright © 2024 - Toate drepturile rezervate