Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Structurile de Control

Informatica


Structurile de Control

Obiective



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.


Puteti schimba cursul logic al instructiunilor īnauntrul unui block PL\SQL cu ajutorul structurilor de control. Aceasta lectie explica doua tipuri de structuri de control; constructiile conditionate de instructiunea IF si structurile de control LOOP (dezbatute mai tīrziu īn aceasta lectie).

Sunt trei forme ale instructiunii IF:

IF-THEN-END IF

IF-THEN-ELSE END IF

IF-THEN-ELSIF-END IF


Instructiunea 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.

Construirea conditiilor logice

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

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;

 

Bucla FOR

Sfaturi

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

Nota: Limita inferioara si cea superioara nu trebuie sa fie neaparat numerice. Ele pot fi expesii care se convertesc la valori numerice.

Exemplu

DECLARE

v_lower NUMBER

v_uper NUMBER

BEGIN

FOR i IN v_lower .. v_upper LOOP

. . .

END LOOP;

END;

 


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 si etichete

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 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.

Rezumat

Puteti schimba cursul logic al instructiunilor folosind structuri de control.

Conditionale ( instructiunea IF)

Bucle

Bucla de baza

Bucla FOR

Bucla WHILE

Instructiunea EXIT

 

Exercitii practice

Efectuati actiuni de conditionare folosind instructiunea IF

Efectuati pasi iterativi folosind structuri de bucla

 


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

 



Document Info


Accesari: 4486
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )