Limbajul PL/SQL va permite sa folositi instructiuni SQL pentru manipularea datelor bazei de date Oracle si instructiuni pentru controlul programului în vederea procesarii datelor, în conformitate cu propriile dumneavoastra necesitati. Limbajul PL/sQL combina puterea de manipulare a datelor caracteristica instructiunilor SQL, cu puterea de procesare a datelor caracteristica limbajelor procedurale. Limbajul PL/SQL prevede diverse structuri pentru controlul executiei instructiunilor si al manipularii datelor. Acestea sunt:
Cursoarele
Procedurile
Functiile
Pachetele
Structurile de control reprezinta cea mai importanta completare adusa de PL/SQL limbajului SQL. Limbajul PL/SQL va permite nu numai sa manipulati datele, ci si sa procesati datele folosind instructiuni de control conditionale, iterative, secventiale si neconditionale, cum sunt:
if-then-else, for-loop, while-loop, exit-when si goto.
Prin utilizarea acestora, puteti gestiona orice situ 24524k1010y atie, în plus, limbajul PL/SQL ofera si urmatoarele avantaje:
Productivitate - Limbajul PL/SQL adauga noi functionalitati instrumentelor neprocedurale, cum ar fi Oracle Reports si Oracle Forms.
Performanta - Limbajul PL/SQL permite transmiterea prin retea, catre server, a unui bloc de instructiuni SQL ca pe o singura entitate (dintr-o data). PL/SQL elimina necesitatea transmiterii instructiunilor individuale.
Portabilitate - Limbajul PL/SQL este portabil pe orice sistem de operare pe care ruleaza SGBDR Oracle.
Integrare - Puteti sa combinati sau sa integrati cele doua limbaje, SQL si PL/SQL, astfel' încât programul dumneavoastra sa beneficieze de performantele ambelor.
În acest capitol, veti face cunostinta cu elementele si notiunile fundamentale ale limbajului PL/SQL. Sunt de asemenea prezentate formatul standard al unui program PL/SQL si al structurilor de programare procedurala ale acestuia.
PL/SQL este un limbaj structurat pe blocuri. Blocurile reprezinta unitatea logica de lucru fundamentala a unui program PL/SQL. Aceste blocuri includ structuri cum ar fi procedurile, functiile si cursoarele. Blocurile pot contine, la rândul lor, alte blocuri, numite blocuri imbricate.
Blocurile de cod PL/SQL sunt create pentru rezolvarea unor sarcini sau probleme specifice. De exemplu, puteti crea un bloc PL/SQL care sa numere pur si simplu facturile primite într-o ora. '
Blocurile sunt compuse din trei parti distincte:
Declaratia si initializarea variabilelor
Codul PL/SQL executabil
Aceasta este partea obligatorie a unui bloc. Celelalte doua parti sunt facultative.
Partea continând rutinele pentru tratarea exceptiilor
Portiunea declaratiilor unui bloc efectueaza urmatoarele:
Declara numele unui identificator
Stabileste daca identificatorul este o variabila sau o constanta
Stabileste tipul identificatorului
Stabileste daca identificatorul accepta valori nule
Initializeaza identificatorul, daca este cazul
Exemplele urmatoare ilustreaza declararea identificatorilor într-un bloc PL/SQL: declare
-- variabila pentru stocarea numelui articolului v_nume_articol varchar2(50);
-- variabila pentru stocarea datei comenzii; este initializata cu data curenta a sistemului. v_data_comanda date not nuli :=sysdate;
-- variabila pentru tinerea evidentei comenzilor procesate; este initializata la valoarea zero v_numarare_comenzi binary_integer:=0;
-- creeaza un indicator al validitatii unei comenzi v_comanda_valida boolean not nuli := true;
Identificatorii sunt locali în blocul în care au fost declarati si^înceteaza sa mai existe în momentul în care procesarea blocului s-a încheiat, în mod prestabilit, identificatorii au valoarea nuli daca nu sunt initializati.
Exemplul urmator prezinta un bloc PL/SQL tipic:
declare
cod_art_nou s_cod__art%type;
cod_art_retinut s_cod_art%type;
begin
select cod
into cod_art nou
from lst_articole
where cod = :p_cod_art;
commit,
exception
when no_data_found then
rollback;
commit;
end;
Structurile de control permit programului sa schimbe cursul logic al instructiunilor PL/SQL. Limbajul PL/SQL suporta patru structuri de control fundamentale: conditionala, iterativa, secventiala si neconditionala. Aceste patru structuri pot fi combinate în orice mod, în vederea rezolvarii unei anumite probleme.
Paragrafele urmatoare prezinta în detaliu aceste structuri.
Puteti executa o instructiune sau o secventa de instructiuni în functie de îndeplinirea unei conditii folosind instructiunea i f-then. Uneori este necesar sa efectuati actiuni alternative, în functie de o anumita conditie sau situatie.
Cea mai simpla forma de instructiune de control conditional este instructiunea if-then. Sintaxa acestei instructiuni este urmatoarea:
if conditie then instructiune(i); end if;
Instructiunile care urmeaza imediat dupa instructiunea conditionala i f sunt executate numai daca conditia este îndeplinita (ia valoarea True). Atunci când conditia ia valoarea False, instructiunile sunt sarite fara sa fie procesate.
Un scenariu mult mai probabil este cel în care aveti seturi distincte de instructiuni care urmeaza sa fie executate în functie de instructiunea conditionala. Structura if-then-else asigura executarea unuia dintre cele doua seturi de instructiuni, indiferent daca este îndeplinita sau nu conditia.
Sintaxa structurii if-then-else este foarte asemanatoare cu sintaxa structurii if-then. Exemplul urmator ilustreaza utilizarea structurii if-then-else:
if suma_datorata > 100000 then
update Tst_audit -- executata numai atunci când conditia
-- este adevarata
set comentarii = 'sistati vânzarile'; else update lst_audit - executata numai atunci când conditia
-- este falsa
set comentarii = 'continuati sa vindeti'; end if
Puteti chiar sa imbricati instructiuni if-then-else, dupa cum se poate vedea în exemplul urmator:
if suma_datorata > 100000 then
update lst_audit
set comentarii = 'sistati vânzarile';
/* Secventa urmatoare este executata numai daca conditia din instructiunea anterioara este falsa */
else
if suma_datorata = 10000 then
update lst_audit -- executata numai atunci când - conditia este adevarata set comentarii = 'contactati clientul';
/* Secventa urmatoare este executata numai daca conditia din instructiunea anterioara este falsa */ else
update lst_audit set comentarii = 'continuati sa vindeti';
end if end if
Fiecare instructiune if-then trebuie sa aiba o singura instructiune else si trebuie sa se încheie cu o instructiune end if.
In anumite situatii, este necesara o modalitate de a selecta o actiune dintre mai multe alternative care se exclud reciproc. Solutia acestei probleme o reprezinta urmatoarea forma a instructiunii if-then. Instructiunea if-then-elsif va permite sa aveti mai mai multe conditii care se exclud reciproc. Sintaxa acestei instructiuni este urmatoarea:
if conditiei then instructiunel(i) ;
elsif conditie2 then instructiune2(i);
else
instructiuneS(i); end if;
Iata cum functioneaza aceasta structura. PL/SQL evalueaza prima conditie. Daca este adevarata, este executata instructiunel, iar restul structurii este sarita, fara a fi executata, în cazul în care conditiei are valoarea False sau Nuli, este testata clauza elsif. si de aceasta data, daca conditie2 are valoarea True, este executata instructiune2, iar restul structurii este sarita, în cazul în care conditie2 are valoarea False sau Nuli, controlul trece la instructiuneS, aceasta este executata si se paraseste structura.
Puteti avea o singura clauza else. în schimb, puteti avea oricât de multe clauze elsif doriti. Pentru a îmbunatati claritatea programului, folositi clauza elsif în locul instructiunilor i f imbricate.
Instructiunile de control iterativ va permit sa executati de mai multe ori o secventa de instructiuni. Cea mai simpla forma de instructiune iterativa este ciclul (loop).
Sintaxa instructiunii loop este urmatoarea:
loop
instructiune(i) end loop;
Dupa fiecare procesare a ciclului, controlul revine la începutul ciclului si instructiunile sunt executate din nou. Instructiunea exit permite parasirea ciclului. Instructiunea exit trebuie plasata în interiorul ciclului. Exemplul urmator foloseste formatul loop-exit pentru procesarea unor înregistrari:
begin
loop - începutul ciclului
total=total + 1;
if total >=100 then - testeaza conditia de parasire a ciclului
exit; - forteaza parasirea ciclului
end if; end loop;
Mecanismul for-loop permite parcurgerea unui ciclu de un numar specificat de ori. Sintaxa instructiunii for-loop este urmatoarea:
for contor in limita inferioara..limita superioara loop instructiune(i) end loop;
Domeniul valorilor întregi valide ale contorului este evaluat o singura data, la intrarea în ciclu. Dupa fiecare iteratie, contorul este incrementat în mod implicit. De asemenea, contorul este declarat în mod implicit, deci nu trebuie sa-1 declarati dumneavoastra. La intrarea în ciclu, daca în urma evaluarii, limita superioara este mai mica decât limita inferioara, instructiunile nu sunt executate. Exemplul urmator ilustreaza un ciclu simplu for-loop:
for I in 1..50 loop
instructiuni - instructiunile vor fi executate de 50 de ori
end loop;
Valorile limitei superioare si ale limitei inferioare pot fi constante, variabile sau expresii, însa în urma evafuarii trebuie sa ia valori întregi, în plus, domeniul ciclului poate fi determinat dinamic la rulare. De exemplu, codul urmator stabileste limita superioara a domeniului ciclului, egala cu numarul de angajati ai companiei:
select count(*) into limita_superioara
from angajati
where sit_ang = "A";
for I !.. limita_superioara loop salariu = salariu*!.1;
end loop;
Pentru a parcurge valorile contorului în sens invers, includeti clauza reverse, în exemplul urmator, contorul începe de la valoarea 10 si este decrementat cu l la fiecare executie a ciclului:
for I in reverse 1..10 loop
instructiuni - instructiunile vor fi executate de 10 ori
end loop;
Dupa ultima parcurgere a ciclului, variabila contor devine nedefinita. De asemenea, atâta timp cât ciclul este activ, variabila contor este locala si nu se poate face referire la ea în exteriorul ciclului.
In limbajul PL/SQL, puteti atasa o eticheta unui ciclu. Aceasta eticheta, care este un identificator nedeclarat, trebuie sa apara la începutul ciclului si trebuie încadrata între paranteze unghiulare duble. Optional, aceasta eticheta poate fi plasata la sfârsitul instructiunii de ciclare, fara paranteze unghiulare.
Exemplul urmator foloseste etichete pentru a marca începutul si sfârsitul structurii de ciclare:
«ciclu_inventar» - eticheta ciclului
loop
end loop ciclu_inventar;
Structurile while-loop repeta o instructiune pâna în momentul în care o conditie devine falsa. Sintaxa instructiunii while loop este urmatoarea:
while conditie loop instructiune(i) end loop
înaintea fiecarei iteratii, conditia este evaluata, în cazul în care conditia are valoarea True, instructiunile sunt executate, în caz contrar, instructiunile sunt sarite, fara a fi executate. Exemplul urmator ilustreaza ciclul while loop:
declare
v_contor number(2) := 1;
begin
while v_contor <=50 loop
select nume_client into vizitator.nume
from registru
v_contor := v_contor + 1;
end loop;
end;
Numarul de iteratii care urmeaza sa fie efectuate de un ciclu while loop este necunoscut pâna în momentul încheierii ciclului. Acest numar depinde de instructiunea conditionala, întrucât conditia este evaluata la începutul ciclului, este posibil ca instructiunile sa nu fie executate nici macar o data.
În mod prestabilit, blocurile PL/SQL sunt executate secvential, de sus în jos. Procesarea începe cu instructiunea begin si se încheie cu instructiunea end. Programatorul poate modifica cursul prestabilit de procesare a instructiunilor, prin introducerea uneia dintre structurile de control prezentate anterior în acest capitol.
Doua dintre cele mai rar folosite structuri de control sunt instructiunile de control neconditional goto si nuli.
Instructiunea goto forteaza ramificarea neconditionata a cursului procesarii, prin executarea unui salt la o eticheta. Atunci când este executata, instructiunea goto transfera controlul instructiunii sau blocului etichetat. Sintaxa instructiunii goto este urmatoarea:
goto nume_eticheta;
În exemplul urmator, instructiunea goto este folosita pentru a transfera controlul instructiunii etichetate art nou:
select count(*) cod_articol into nr_articole
from lst_articole;
for contor 1.. nr_articole loop
select nr articol from lis_inventar;
if nr_artTcol like 'AU%'
then goto art_nou;
else insert into lst_articole values (nr_articol);
end i f
«art_nou»
insert into audit_articole values (:nume_utilizator, nr_articol);
insert into lst_articole values (nr_articol);
end loop;
Instructiunile goto fac obiectul urmatoarelor restrictii:
Controlul nu poate fi transferat unei instructiuni din interiorul unei structuri if sau loop sau al unui subbloc
Controlul nu poate fi transferat în exteriorul unui subprogram
Controlul nu poate fi transferat dintr-un modul de tratare a erorilor în blocul curent
Instructiunea nuli nu face altceva decât sa transfere controlul instructiunii care urmeaza dupa ea. Practic, instructiunea nuli specifica în mod explicit faptul ca nu va fi efectuata nici o actiune. Urmeaza un exemplu tipic de utilizare a instructiunii nuli:
if cant<= 50000 then
- sunt efectuate diverse procesari
else
nuli - nu se executa nimic;
end if;
Limbajul PL/SQL prevede doua tipuri de date compuse: table si record. Tabelele PL/SQL sunt obiecte de tip table, care sunt asemanatoare, însa nu identice, cu tabelele unei baze de date. Aceste tabele va dau posibilitatea sa accesati liniile de date ca si cum ar fi niste matrice.
Tabelele PL/SQL sunt declarate în portiunea declaratiilor unui bloc. Ele pot sa contina o singura coloana si o singura cheie principala, nici una dintre acestea neputând fi denumita. Cheia principala trebuie definita ca fiind de tip
binary_integer.
Pentru a declara un tabel PL/SQL, trebuie sa declarati^ mai întâi un tip de tabel, dupa care puteti declara variabile de tipul respectiv, în exemplul urmator este declarat un tip de tabel PL/SQL:
declare
type tip_tabel_ang is table of varchar2(35)
indexed by binary_integer;
Dupa ce ati declarat un tip de tabel, declarati variabile de tipul respectiv, în exemplul urmator, este declarata o variabila folosind tipul de tabel definit anterior:
tabel_ang tip_tabel_ang
Pentru a face referire la un tabel PL/SQL, specificati o valoare a cheii principale, folosind sintaxa matriceala. De exemplu, pentru a face referire la a doisprezecea linie a tabelului PL/SQL creat în exemplul anterior, veti folosi urmatoarea instructiune:
tabel_ang(12);
În continuarea acestui exemplu, ati putea sa atribuiti valori liniilor tabelului PL/SQL. Exemplul urmator atribuie o valoare tabelului tabel_ang:
declare
type tip_tabel_ang is table of varchar2(35)
indexed by binary_integer;
i binary_integer:=0;
begin
for ang_nou in
(select nume_ang from personal where cod_vechime = 'NU');
loop
i:=i+l;
tabel_ang(i) := ang_nou,nume_ang; - insereaza numele noilor angajati
end loop;
end
La utilizarea PL/SQL, trebuie respectate urmatoarele reguli:
Pentru inserarea valorilor dintr-un tabel PL/SQL într-o coloana a unei baze de date, trebuie utilizat un ciclu.
Pentru a prelua date dintr-o coloana a unei baze de date într-un tabel PL/SQL, trebuie utilizat un ciclu.
Nu puteti folosi comanda delete pentru a elimina continutul unui tabel PL/SQL! Pentru a face acest lucra, trebuie sa atribuiti un tabel gol tabelului PL/SQL al carui continut vreti sa-1 eliminati.
Cel de-al doilea tip compozit este record. O înregistrare reprezinta o linie a unui tabel sau o linie preluata de un cursor. Numele câmpurilor înregistrarilor sunt unice si pot contine diverse tipuri de date.
Pentru a declara o înregistrare PL/SQL, trebuie sa declarati mai întâi un tip de înregistrare, dupa care puteti declara variabile de tipul respectiv, în exemplul urmator este declarat un tip de înregistrare PL/SQL:
declare
type tip_inreg_ang is record (marca__ang number(5) not nuli, nume_ang varchar2(35), data_angajare date, nr_dept varchar2(5));
Dupa declararea tipului, puteti declara înregistrari de tipul respectiv:
inreg_ang tip_inreg_ang
Exemplul urmator ilustreaza declararea si utilizarea înregistrarilor PL/SQL:
declare
type tip_inreg_ang is record -- declaratia tipului record
(marca__ang number(5) not nuli,
nume_ang varchar2(35) ,
data_angajare date,
nr_dept varchar2(5));
inreg_ang tip_inreg_ang; -- declaratia variabilei
begin
select marca, nume, data_ang, dept
into inreg_ang
from lista_personal;
end
La utilizarea PL/SQL, trebuie respectate urmatoarele reguli:
Înregistrarile de tipuri diferite nu pot fi atribuite una alteia.
Nu puteti atribui o lista de valori unei înregistrari folosind instructiunea assign.
Egalitatea sau inegalitatea înregistrarilor nu poate fi testata.
Structurile PL/SQL va permit sa controlati în mod explicit cursul programelor dumneavoastra. Limbajul PL/SQL combina forta limbajului SQL cu propriile sale structuri procedurale, pentru a da programatorului posibilitatea sa adapteze programul cerintelor impuse.
Structurile PL/SQL va pun la dispozitie mecanismele necesare pentru controlul (conditional, iterativ, secvential si neconditional) cursului programului; în plus, aceste structuri îmbunatatesc performantele globale ale serverului, simplifica munca de dezvoltare a aplicatiilor si promoveaza portabilitatea codului.
În acest capitol, ati facut cunostinta cu elementele fundamentale ale structurilor PL/SQL si ati vazut care surit avantajele utilizarii lor. De asemenea, a fost prezentat modul de utilizare a acestor structuri.
|