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




Structuri PL/SQL

sql


Structuri PL/SQL

Ce sunt structurile PL/SQL?

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

De ce se folosesc structuri le limbajului PL/SQL?

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.

Cum se folosesc structurile PL/SQL

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

Blocuri simple

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;

Structuri de control

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.

Control conditional

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.

Instructiuni if-then

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.

Instructiuni if-then-else

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.

Instructiuni if-then-elsif

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.

Control iterativ

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

Instructiuni 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;

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

Etichete loop

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;

Instructiuni while

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.

Control secvential

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

Control neconditional

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;

Tabele PL/SQL

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.

Înregistrari PL/SQL

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.

Rezumat

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.


Document Info


Accesari: 4322
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 )