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:
IF conditie THEN Instructiuni1; ELSE Instructiuni2; END IF
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.
IF conditie THEN Instructiuni1; ELSE IF conditie2 THEN Instructiuni2; END
IF 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.
IF v_ename
= 'KING' THEN v_job := 'MANAGER'; ELSE v_job := 'CLERK'; END IF
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:
IF conditie1 THEN instructiuni1; ELSEIF conditie2 THEN instructiuni2; ELSEIF conditie3
THEN instructiuni3 END IF;
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.
Puteti
manipula valori nule cu operatorul IS NULL. Orice expresie
ce contine o valoare nula este evaluata ca NULL. Concatenarea expresiilor
cu o valori nule se face prin tratarea valorii nule ca un string empty
(gol)
Construirea conditiilor logice
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 >
v sal
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.
'PL' | | v_string | | 'SQL'
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.
FOR i IN 3 . . 3 LOOP instructiune; END LOOP;
Faceti
referiri la contor doar īn cadrul buclei; el este nedefinit īn afara ei. Folositi o
expresie pentru a va referi la o valoare existenta a contorului. Nu va
referiti la contor ca la tinta unei asignari.
Bucla FOR
Sfaturi
Bucla FOR
Nota: Limita inferioara si cea superioara nu trebuie sa fie neaparat numerice. Ele pot fi expesii care se convertesc la valori numerice.
v_lower NUMBER v_uper NUMBER BEGIN FOR i IN v_lower .. v_upper LOOP . . . END LOOP; END;
DECLARE
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 imbricate
pe nivele multiple. Folositi
etichete pentru a face diferenta īntre blocuri si bucle. Iesiti
din bucla exterioara cu instructiunea EXIT referita la eticheta.
Bucle imbricate si etichete
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.
Puteti schimba cursul logic al
instructiunilor folosind structuri de control. Conditionale
( instructiunea IF) Bucle Bucla de
baza Bucla FOR Bucla WHILE Instructiunea
EXIT
Rezumat
Efectuati
actiuni de conditionare folosind instructiunea IF Efectuati
pasi iterativi folosind structuri de bucla
Exercitii practice
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.
Introduceti numarul
angajatului: 7364 PL SQL procedure successfully completed. Introduceti numarul
angajatului: 8000 PL SQL procedure successfully completed. EMPNO SAL STARS
|