Dupa completarea acestei lectii veti fi capabili sa faceti urmatoarele:
Identificarea folosirii si tipurile de structuri de control
Constructia unei declaratii IF
Constructia si identificarea diferitelor declaratii de bucle
Sa folositi tabele logice
Controlarea blocurilor folosind bucle si etichete
Scopul lectiei:
În aceasta lectie, veti învata despre structurile de control înauntrul blocurilor PL/SQL prin folosirea instructiunilor IF si a buclelor.
Sunt trei forme ale instructiunii IF:
IF-THEN-END IF
IF-THEN-ELSE END IF
IF-THEN-ELSIF-END IF
Structura instructiunii IF în PL/SQL este similara cu structura instructiunii IF în alte limbaje procedurale. Instructiunea permite realizarea de actiuni selective bazate pe o conditie.
în sintaxa:
conditie este o variabila Booleana sau expresie (TRUE, FALSE sau NULL). Este asociata cu o lista de instructiuni care sunt executate doar în cazul în care conditia este TRUE.
THEN este o clauza asociata cu expresia Booleana pe care o precede cu o secventa de instructiuni.
instructiuni pot fi una sau mai multe instruc]iuni PL/SQL. Pot sa includa alte instructiuni IF, ELSE si ELSIF.
ELSIF este un cuvînt cheie ce introduce o expresie Booleana. Daca prima conditie este FALSE sau NULL atunci cuvîntul cheie ELSIF introduce un noua conditie.
ELSE este un cuvant cheie care realizeaza execu]ia instructiunilor care urmeaza dupa el daca controlul ajunge pe acesta.
Instructiunea IF simpla
În exemplul din figura, PL SQL relizeaza doua actiuni ( seteaza v_job, v depno si v new_comm ) doar daca conditia din IF este TRUE. Daca conditia este FALSE or NULL, PL SQL ignora instructiunile de setare. În acest caz se continua cu executia instructiunilor de dupa END IF.
OBS:
Se pot realiza actiuni selective bazate pe o conditie întîlnita. 15415j921p
Când scrieti cod, amintiti-va scrierea cuvintelor cheie:
ELSEIF este un cuvânt;
END IF sunt doua cuvinte;
Daca conditia Booleana este TRUE, se executa instructiunile asociate; daca conditia este FALSE or NULL, secventa de instructiuni asociata este sarita. Este permis orice numar de clauze ELSEIF.
Poate sa existe cel mult o clauza ELSE.
Aliniati instructiunile pentru claritate.
Daca conditia este FALSE or NULL, puteti folosi o clauza ELSE pentru a executa alte actiuni. La fel ca la instructiunea simpla IF, controlul executiei programului este redat instructiunilor de dupa ENDIF.
Exemplu:
|
Imbricarea instructiunilor IF
Fiecare set de actiuni a unui IF poate include alta instructiune IF înainte de a realiza orice alta actiune. Clauzele THEN si ELSE pot include instructiuni IF. Fiecare IF imbricata trebuie terminata cu END IF.
|
Exemplu:
Înlocuiti ocupatia cu Manager daca numele angajatului este King. Daca numele angajatului este altul decât King atunci ocupatia sa fie Clerk.
|
Cursul executiei instructiunii IF-THEN-ELSIF
Într-un formular al unei aplicatii Oracle, introduce-ti numarul departamentului al noilor angajati pentru a determina bonusul lor.
. .
IF :dept.deptno 10 THEN
v_comm := 5000;
ELSEIF :dept.deptno 20 THEN
v_comm := 7500;
ELSE
v_comm := 2000;
END IF;
. .
În exemplu variabila v comm este folosita pentru a introduce într-un câmp bonusul angajatului iar :dept.deptno reprezinta valoarea introdusa în câmpul din formular.
Instructiunea IF-THEN-ELSEIF
Când este posibil, folositi clauza ELSEIF înaintea instuctiunilor IF imbricate. Codul este mai usor de citit si de de înteles, iar logica programului este mai usor de înteles. Daca actiunea în clasa ELSE depinde de alta instructiune IF, este mult mai convenabil sa folosim clauza ELSEIF.Aceasta face codul clar prin îndepartarea nevoii de a folosi END IF la sfârsitul fiecarui alt set de conditii si actiuni.
Exemplu:
|
Exemplul IF-THEN-ELSEIF de mai sus este definit dupa cum urmeaza
Pentru o valoare introdusa, returneaza o valoare calculata. Daca valoarea introdusa este peste 100, atunci valoarea calculata este de doua ori valoarea introdusa. Daca este între 50 si 100 atunci rezultatul este 50% din valoarea de start. Daca valoarea introdusa este mai mica decât 50 atunci valoarea calculata este 10% din valoarea de start.
Nota Orice expresie aritmetica continînd o valoare nulla este evaluata la null.
|
Construirea conditiilor logice
Puteti construi o simpla conditie Booleana prin combinatii de numere, caractere sau date cu un operator de comparare. În general manipularea valorilor nulle se face cu operatorul IS NULL.
NULL în expresii si comparari
Operatorul IS NULL este evaluat ca TRUE doar daca variabila este NULL .
Orice expresie continînd o valoare nulla este evaluata ca NULL, cu exceptia unei expresii concatenate, caz în care se trateaza valoarea nulla ca un string gol.
Exemplu
|
|
v_sal este evaluat ca fiind NULL daca v sal este NULL în ambele cazuri de mai sus. În urmatorul exemplu urmator v string nu este evaluat ca NULL daca acesta este NULL.
|
Conditii Booleene cu operatori logici
Puteti construi o conditie booleana complexa prin combinarea unei simple conditii booleene cu operatorii logici AND, OR sau NOT. În tabelele prezentate, False are precedenta într-o conditie AND si TRUE are precendenta într-o conditie OR. AND returneaza TRUE daca ambii operatori sunt TRUE. OR returneaua FALSE daca ambii operatori sunt FALSE. NULL AND TRUE este evaluat ca NULL pentru ca nu se stie daca primul operator este TRUE sau FALSE.
Nota Negatia lui NULL (NOT NULL) este o valoare nulla deoarece valorile nule sunt nedeterminante.
Construirea de conditii logice
Tabelul operatorului AND va poate ajuta pentru a evalua conditia Booleana din exemplul de mai sus.
Controlul iterativ instructiunea LOOP
PL/SQL prevede o serie de facilitati pentru bucle structurate pentru a repeta o serie de instructiuni de mai multe ori.
Bucla este un al doilea tip de structura de control:
Bucle de baza care realizeaza actiuni repetitive fara alte conditii suplimentare.
Bucla FOR care realizeaza controlul iterativ bazat pe un contor.
Bucla WHILE care realizeaza controlul iterativ bazat pe o conditie.
Instructiunea EXIT pentru atermina o bucla.
Nota: Un alt tip de bucla FOR LOOP, cursorul FOR LOOP este discutat într o alta lectie.
Bucla de baza LOOP
Cea mai simpla forma a instructiunii LOOP este o bucla simpla (infinita), ce include o secventa de instructiuni între cuvintele cheie LOOP si END LOOP. De fiecare data când cursul executiei atinge instructiune END LOOP, controlul este redat instructiunii corespondente LOOP de mai înaintea ei. O astfel de bucla permite executia instructiunilor macar o data chir daca conditia este falsa la intrarea în bucla.
Repetati instructiunile de la un capat la altul cu ajutorul unei bucle.
Fara instructiunea EXIT bucla va fi infinita.
Instructiunea EXIT
Puteti termina o bucla folosind instructunea EXIT. Controlul este redat urmatoarei instructiuni de dupa instructiunea END LOOP. Puteti folosi EXIT împreunacu o instructiune IF sau ca o instructune de sine statatoare înauntrul buclei. Instructiunea EXIT trebuie plasata în interiorul buclei. Aditional puteti adauga clauza WHEN împreuna cu o conditie pentru a conditiona terminarea buclei. Când instructiunea EXIT este atinsa se evalueaza clauza WHEN. Daca conditia este TRUE bucla se încheie si controlul este preluat de prima instructiune de dupa END LOOP. O bucla poate contine mai multe instructiuni EXIT.
Bucla de baza LOOP
Exemplul realizeaza urmatoarele insereaza în primele 10 linii item uri pentru numarul de ordine 101.
Nota
O bucla de baza permite executia instructiunilor cel putin o data chiar daca conditia este adevarata la intrarea în bucla.
Buclele FOR au aceeasi structura generala ca buclele de baza, ele au un control al executiei la începutul cuvîntului cheie pentru a determina numarul de iteratii pe care le face PL SQL.
În sintaxa,
contor este un întreg declarat implicit a carui valoare este incrementata sau decrementata ( decrementata daca este folosit cuvîntul cheie REVERSE ) automat, la fiecare iteratie a buclei pîna când este atinsa limita superioara sau inferioara.
REVERSE produce decrementarea indexului la fiecare iteratie de la limita superioara spre cea inferioara. De notat ca valoarea inferioara este totusi scrisa prima.
limita_inferioara specifica marginea inferioara pentru zona acoperita de valoarea indexului.
limita_superioara specifica marginea superioara pentru zona acoperita de valoarea indexului.
De exemplu, instructiunea urmatoare este executata o singura data.
|
|
Bucla FOR
Nota: Limita inferioara si cea superioara nu trebuie sa fie neaparat numerice. Ele pot fi expesii care se convertesc la valori numerice.
|
Instructiunea WHILE
Puteti folosi bucla WHILE pentru a repeta o secventa de instructiuni atîta timp cît conditia este adevarata ( TRUE ). Conditia este evaluata la începutul fiecarei iteratii. Bucla se termina cînd conditia este falsa la începutul buclei si atunci nici o iteratie nu mai este facuta.
Bucla WHILE
În exemplul de mai sus cantitatea este incrementata cu fiecare iteratie a buclei pîna cînd cantitatea nu mai este mai mica decît pretul maxim permis pentru un obiect.
|
Bucle si etichete imbricate
Puteti imbrica bucle la nivele multiple. Puteti imbrica bucle FOR în interiorul buclelor WHILE si buclele WHILE în interiorul buclelor FOR. Normal, terminarea unei bucle imbricate nu termina bucla inclusa daca nu apare o exceptie. În orice caz puteti eticheta buclele si iesiti din bucla exterioara cu instructiunea EXIT.
Numele etichetelor respecta aceleasi reguli ca ceilalti indentificatori. O eticheta este plasata înaintea unei instrucsiuni pe aceeasi linie, ori pe o linie separata. etichetati buclele plasînd eticheta înaintea cuvîntului cheie LOOP în delimitatorii de eticheta ( << eticheta >>
Daca bucla este etichetata, numele etichetei poate fi optional inclus dupa instructiunea END LOOP.
|
|
Exercitii practice
În aceste exercitii practice veti crea blocuri PL/SQL care contin bucle si structuri de control conditionate.
Rulati scriptul LABS\lab19_1.sql pentru a crea tabela MESSAGES. Scrieti un bloc PL/SQL pentru a insera numere în tabela messages
a. Inserati numerele de la 1 la 10 excluzînd 6 si 8.
b. Realizati COMMIT înainte de finele blocului.
c. Faceti un SELECT pe tabela MESSAGES pentru a verifica daca blocul a functionat bine.
Creati un bloc PL SQL care calculeaza valoarea comisionului pentru un angajat dat folosind salariul acestuia.
a. Rulati scriptul LABS\lab19_2.sql pentru a insera un nou angajat în tabela EMP. Nota: Angajatul va avea salariul NULL.
b. Acceptati numarul angajatului ca intrare cu o variabila de substitutie SQL Plus.
c. Daca salariul angajatului este mai mic ca 1000$ fixati comisionul angajatului la 10% din salar.
d. Daca salariul angajatului este între 1000$ si 1500$ fixati comisionul angajatului la 15% din salar.
e. Daca salariul angajatului este mai mare ca 1500$ fixati comisionul angajatului la 20% din salar.
f. Daca salariul angajatului este NULL fixati comisionul angajatului la 0
g. COMMIT
h. Testati blocul PL/SQL pentru fiecare caz folosind urmatoarele cazuri de test:
Numarul angajatului |
Salar |
Comisionul rezultat |
NULL |
NULL |
EMPNO |
ENAME |
SAL |
COMM | |
DOE | ||||
ALLEN | ||||
MILLER | ||||
SMITH |
Modificati pl6q4.sql pentru a insera textul Numarul este par" sau "Numarul este impar" în functie de paritatea sau imparitatea numarului, în tabela MESSAGES. Interogati tabela pentru avedea daca blocul construit a functionat corect.
Adaugati o coloana noua la tabela EMP pentru a stoca (
Creati un bloc PL/SQL care recompenseaza un angajat concatenînd un asterisc în coloana STARS pentru fiecare 1000 din salariul angajatului. Rontujiti salariul angajatului la cel mai apropiat numar întreg. Salvati blocul PL SQL într-un fisier numit pl9q5.sql.
a. Acceptati ID-ul angajatului ca intrare într-o variabila de substitutie SQL Plus.
b. Initializati o variabila pentru a contine un sir de asterixuri.
c. Concatenati un asterisc la sir pentru fiecare 100 din salar. De exeplu daca un angajat are un salar de 800 , sirul de asteriscuri va contine 8 asteriscuri.
d. Revizuiti coloana STARS pentru angajat dupa metoda de la punctul anterior.
e. Realizati COMMIT.
f. Testati blocul pentru un angajat care are salariu.
|
|