Documente Academic
Documente Profesional
Documente Cultură
Figura 17.1.
Cursor multi-linie.
De ce se folosesc cursoarele?
Puteti sa va imaginati un cursor ca fiind un fisier care urmeaza sa fie procesat de la nceput pna
la sfrsit, nregistrare cu nregistrare. Cursoarele sunt folosite pentru a procesa linie cu linie seturi
de rezultate multi-linie. n plus, cursoarele tin evidenta liniei curent accesate, ceea ce permite
procesarea interactiva a setului activ.
Utilizarea mai multor cursoare simultan poate mbunatati performantele sistemului prin reducerea
frecventei interpretarii si deschiderii cursoarelor. Dupa fiecare parcurgere iterativa a cursorului,
acesta pastreaza suficiente informatii despre setul activ si instructiunile SQL nct poate fi reexecutat de mai multe ori. Fiecare noua iteratie este realizata fara sa fie necesara redeschiderea
si interpretarea cursorului.
Prin deschiderea mai multor cursoare, forma interpretata a instructiunilor SQL poate fi salvata,
eliminndu-se n acest fel neajunsurile legate de deschiderea si interpretarea repetata a
cursorului.
Cum se folosesc cursoarele
Limbajul SQL*Plus creeaza n mod implicit un cursor pentru fiecare instructiune DML executata.
Acest lucru survine indiferent daca interogarea returneaza una sau mai multe linii. Utilizatorii au
posibilitatea sa declare n mod explicit un cursor pentru procesarea linie cu linie a setului multilinie activ, n continuare, sunt prezentate etapele care trebuie parcurse pentru crearea si utilizarea
cursoarelor:
1.
Declararea cursorului
2.
Deschiderea cursorului
3.
4.
nchiderea cursorului
Se denumeste cursorul
Numele pe care l atribuiti unui cursor nu este o variabila PL/SQL ci un identificator nedeclarat.
Numele este folosit pentru a face referire la interogare. Nu puteti sa atribuiti valori numelui unui
cursor si nici sa-1 folositiJn expresii. Rezultatele interogarii cursorului devin setul activ al
cursorului, n exemplul urmator, este declarat un cursor numit c_articole:
declare
cursor c_articole IS
select * from lista_articole;
Nu exista o limita predefinita n legatura cu numarul maxim de cursoare care pot exista pe
parcursul unei sesiuni. Singura limitare a numarului de cursoare este data de memoria
disponibila pentru gestionarea lor. De asemenea, exista o limita a numarului de cursoare din
ntregul sistem per sesiune. Aceasta limita este data de valoarea parametrului open_cursor si
este stabilita de administratorul bazei de date.
Atunci cnd lucrati cu cursoare, puteti folosi parametri pentru a transfera cursorului diverse Valori
care sa le nlocuiasca pe cele prestabilite. Acesti parametri trebuie declarati odata cu cursorul.
Parametrii pot sa apara ntr-o interogare oriunde poate sa apara o constanta.
Acest atribut boolean are valoarea True n cazul n care cursorul este
deja deschis. Exemplul urmator verifica daca cursorul numit c_cursor
este deschis. Daca este deja deschis, este executata instructiunea
fetch. Daca este nchis, este executata comanda de deschidere a
cursorului.
Begin
if c_cursor%isopen then
fetch c_cursor into v_cant_comanda,
v_pret_comanda;
else
open c_cursor;
3
end if;
end;
%not found
% found
% rowcount
Daca vreti sa consultati o linie preluata anterior, trebuie sa nchideti si sa redeschideti cursorul,
dupa care sa preluati liniile, una cte una. Daca vreti sa schimbati setul activ, trebuie sa atribuiti
noi valori variabilelor de intrare din interogarea cursorului si sa redeschideti cursorul. In acest fel,
este re-creat setul activ continnd rezultatele actualizate ale interogarii.
declare
v_cant_comanda number(7,2):=0;
v_pret_comanda number(7,2):=0;
total_cx>manda number(11,2):=0;
cursor c_comenzi is - declaratia cursorului
select cant, pret from lista_comenzi;
begin
open c_comenzi
deschiderea cursorului
loop
fetch c_comenzi into v_cant_comanda, v_pret_comanda;
exit when c_comenzi%notfound;
- calculeaza totalul comandat pe baza valorilor cursorului dupa care insereaza rezultatul n tabelul
s_comenzi
v_total_comanda = v_pret_comanda * v_cant_comanda; insert Tnto s_comenzi values
(v_total_comanda); end loop;
close c_comenzi;
- inchide cursorul
commit;
end;
- programul se incheie
nchiderea cursoarelor explicite
Pentru a nchide un cursor, trebuie sa executati instructiunea close. Instructiunea urmatoare
nchide cursorul c_comenzi:
close c_comenzi;
Atunci cnd programul utilizatorului ncheie legatura cu serverul, acesta nchide n mod implicit
cursorul.
Cursoare implicite
Oracle creeaza si deschide n mod implicit un cursor pentru fiecare instructiune SQL care nu face
parte dintr-un cursor declarat n mod explicit. Cel mai recent cursor implicit poate fi considerat a
fi cursorul SQL. Comenzile open, close si fetch nu pot fi folosite n legatura cu cursoarele
6
implicite, n schimb, puteti folosi atributele cursoarelor pentru a obtine prin intermediul cursorului
SQL informatii despre cea mai recent executata instructiune SQL.
Atributele cursoarelor implicite
La
fel
ca
si
cursoarele
explicite,
cursoarele
implicite
au
patru
atribute: %isopen, %f ound, %rowcount si %notf ound. Puteti folosi aceste atribute n instructiuni
procedurale, nsa nu si n instructiuni SQL. Aceste atribute, prezentate n lista care urmeaza, va
permit sa accesati informatii n legatura cu cea mai recenta executie a uneia dintre comenzile
insert, select into, update si delete.
%isopen
%notfound
%found
%rowcount
Valoarea atributelor cursorului se refera ntotdeauna la cea mai recent executata instructiune
SQL. Acest lucru este valabil indiferent unde apare instructiunea n program.
Cursoare de pachet
Sistemul Oracle permite stocarea specificatiei cursorului ntr-un pachet (package). n aceasta
specificatie, trebuie folosita clauza return. Aceasta abordare a cursoarelor va permite sa
modificati corpul cursorului fara sa schimbati specificatia acestuia. Exemplul urmator ilustreaza
un cursor de pachet numit clsal_ang:
create package ang_lunar as
cursor c_sal_ang return ang%rowtype;
end ang_lunar;
create package body ang_lunar as
cursor c_sal_ang return ang%rowtype;
select marca_ang, salariu__ang from lista_ang where
data_angajaFe > '01-JAN-1986'; END ang_lunar;
n specificatia cursorului nu apare instructiune select deoarece clauza return defineste tipul de
data al valorii rezultante. In exemplul precedent, este folosit atributul %rowtype n clauza return
pentru a furniza tipul de nregistrare care reprezinta o linie a bazei de date.
n corpul cursorului apare o instructiune select si aceeasi clauza return ca si n specificatia
cursorului.
Utilizarea ciclurilor for n interiorul cursoarelor
Ca scurtatura pentru preluarea liniilor ntr-un cursor, puteti folosi ciclul for. Ciclul for este parcurs
iterativ o data pentru fiecare linie returnata de interogare. Cursorul nsusi este cel care determina
momentul n care se paraseste ciclul for. Ciclul for simplifica codificarea prin efectuarea
urmatoarelor operatii:
Urmatorul exemplu PL/SQL utilizeaza ciclul for pentru a acumula comenzile pentru fiecare linie
de produse:
accept comanda_prod prompt 'Introduceti numarul comenzii:'
declare
v_id_comanda s_articol_comanda%tip := p_comanda;
v_total_comanda number (11,2) :=0;
cursor c_cursor is
- declaratie cursor
- deschidere implicita
- preluare implicita
v_total_comanda := v_total_comanda +
((inreg_comanda.cant * inreg_comanda.cant)*.95) ;
insert into lista__comenzi (cod_articol, total_comanda)
values (inreg_comanda.cod_articol, v__total_comanda);
end loop;
- nchidere implicita
commit;
- finalizarea tranzactiei
end;
Aliasurile cursoarelor
acestuia. Mai mult, pentru executarea instructiunilor unui cursor trebuie sa l deschideti o singura
data, mbunatatindu-se astfel performantele serverului.
n acest capitol, au fost trecute n revista cele patru etape necesare pentru utilizarea corecta a
cursoarelor. Acestea sunt: declararea cursorului, deschiderea cursorului, preluarea datelor si
nchiderea cursorului.
De asemenea, ati aflat care este diferenta dintre cursoarele implicite si cele explicite si ati vazut
cteva aplicatii practice ale ambelor.
10