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




Cursoare - Ce sunt cursoarele?

Oracle


Cursoare

Ce sunt cursoarele?

Cursoarele sunt structuri care permit utilizatorului sa denumeasca o zona privata de memorie care urmeaza sa pastreze o anumita instructiune, în vederea utilizarii ei ulterioare în sistemul Oracle exista doua tipuri de cursoare: implicite si explicite. Limbajul PL/sQL declara în mod implicit un cursor pentru fiecare dintre instructiunile DML insert, delete si update. Cursoarele explicite sunt declarate de utilizator si sunt folosite pentru 15115p1517p procesarea rezultatelor interogarii lor, care returneaza linii multiple.



Numarul de linii returnate de o interogare poate fi zero, una sau mai multe, în functie de conditiile de cautare ale interogarii. In Oracle, cursoarele sunt destinate procesarii linie cu linie a seturilor de rezultate multi-linie. în lipsa cursoarelor, proiectantul de aplicatii Oracle ar trebui sa preia si sa gestioneze în mod explicit fiecare linie selectata de interogare.

Liniile multiple returnate de o interogare se numesc setul activ. Limbajul PL/SQL defineste dimensiunea acestuia ca reprezentând numarul de linii care au îndeplinit criteriile de cautare si au format setul activ. Figura 17.1 ilustreaza un cursor care contine linii multiple. Prin definitie, fiecare cursor poseda un indicator care tine evidenta liniei curent accesate, ceea ce permite programului dumneavoastra sa proceseze liniile, una câte una.

Figura 17

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 pâna la sfârsit, înregistrare cu înregistrare. Cursoarele sunt folosite pentru 15115p1517p 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 încât poate fi re-executat 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, elimin ndu-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 multi-linie activ în continuare, sunt prezentate etapele care trebuie parcurse pentru crearea si utilizarea cursoarelor:

Declararea cursorului

Deschiderea cursorului

Preluarea datelor în cursor

Închiderea cursorului

Declararea cursoarelor explicite

Cursorul trebuie declarat înainte de a se face referire la el în instructiuni PL/SQL. Prin declararea unui cursor se realizeaza urmatoarele:

Se denumeste cursorul

Se asociaza o interogare cursorului

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- 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 când 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. Exemplul urmator ilustreaza cursorul c_articole si parametrul v_ cant_articol:

declare

cursor c_articole (v_ cant_articol NUMBER) IS select from lista_articole where cant_articol > v_cant_articol;

Deschiderea cursoarelor explicite

Deschiderea cursoarelor explicite duce la executarea interogarii si la identificarea setului activ. Setul activ contine toate liniile care îndeplinesc criteriile de cautare. Pentru cursoarele care sunt declarate folosind clauza for update, programul Oracle blocheaza liniile care îndeplinesc criteriile de cautare ale interogarii cursorului.

în instructiunea cursor open trebuie specificate valorile actuale pentru fiecare parametru specificat în declaratia cursorului. In caz contrar, parametrii care apar în declaratia cursorului vor avea valorile prestabilite.

într-o instructiune open, puteti asocia parametrii actuali, parametrilor formali ai unui cursor folosind notatia pozitionala. Instructiunea urmatoare deschide cursorul c_articole:

open c_articole

Atunci când este executata comanda open, cursorul identifica numai acele linii care satisfac interogarea. Practic, liniile nu sunt citite pâna când nu se face preluarea cursorului. Cursorul este initializat la prima linie a setului activ.



Atributele cursoarelor explicite

Fiecare cursor pe care îl definiti are patru atribute. Prin accesarea acestor atribute pot fi obtinute informatii utile despre cursor. Cele patru atribute ale cursoarelor sunt urmatoarele:

% is open

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;

end if;

end;

%not found

Acest atribut boolean are valoarea True în cazul în care nu a fost returnata nici o linie la cea mai recenta executare a instructiunii fetch. întrucât instructiunea fetch va esua mai devreme sau mai târziu fara sa fie generata nici o exceptie, acest atribut este folosit pentru a parasi ciclul atunci când nu mai este nici o linie de procesat, ca în exemplul urmator:

loop

fetch c_cursor into v_cant_comanda,

v_pret_comanda;

exit when c_cursor%not found;

end loop;

end;

found

Acest atribut are valoarea True pâna în momentul în care ultima instructiune fetch nu preia nici o linie. Acest atribut este opusul logic al atributului not found. Dupa deschiderea cursorului si înaintea primei preluari cu instructiunea fetch, atributul % found are valoarea Nuli. Dupa prima preluare, acest atribut va avea valoarea True pâna în momentul în care comanda fetch nu mai returneaza nici o linie. Acest exemplu foloseste atributul % found pentru a controla executia comenzii insert

begin

loop

fetch c_cursor into v_cant_comanda,

v_pret_comanda;

i c_cursor%found then

insert into lista_comenzi values

(v_cant_comanda, v_pret_comanda);

else

exit;

end if;

end loop;

end;

% rowcount

Acest atribut numeric este egal cu numarul total de linii returnate de instructiunea f etch. Dupa deschiderea cursorului si înaintea primei preluari cu instructiunea f etch, acest atribut are valoarea zero. Dupa prima executare a instructiunii f etch, el are valoare numarului total de linii preluate pâna în acel moment. Exemplul urmator foloseste atributul & r owcount pentru a opri executia dupa procesarea primelor 100 de linii:

begin

loop

fetch c_cursor into v_cant_comanda,

v_pret_comanda ;

exit when c__cursor%rowcount > 100;

end loop;

end;

Utilizarea cursoarelor explicite

Comanda fetch preia liniile din setul activ una câte una. Prima instructiune fetch sorteaza setul activ, daca este necesar. Cursorul avanseaza la linia urmatoare a setului activ ori de câte ori este executata o comanda fetch. Singura cale de a parcurge setul activ este prin intermediul comenzii fetch. Pentru fiecare valoare a unei coloane returnata de interogarea cursorului, în lista trebuie sa existe o variabila care sa-i corespunda. Exemplul urmator ilustreaza utilizarea comenzilor open si f etch, precum si a atributului &notfound:

begin

open c_vizitatori

loop

fetch c_vizitatori into lista vizitatori

exit whe"n c_vizitatori%notfound

end loop;

end;

În exemplul precedent, setul activ definit de cursorul c_vizitatori este procesat linie cu linie. Ciclul iterativ de citire si procesare a liniilor individuale continua pâna la procesarea tuturor liniilor din setul activ.

Exemplul urmator este un script PL/SQL complet care utilizeaza un cursor pentru procesarea datelor în mod individual în acest exemplu, vor fi citite înregistrari continând date referitoare la vânzari înregistrararile sunt procesate, iar datele sunt inserate în fisierul lista_comenzi.

Daca vreti sa consultati o linie preluata anterior, trebuie sa închideti si sa redeschideti cursorul, dupa care sa preluati liniile, una câte 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 continând 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;    - salveaza rezultatele prelucrarii

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 când 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 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

Într-un cursor implicit, acest atribut are întotdeauna valoarea False. Programul închide automat cursoarele implicite dupa executarea instructiunilor SQL asociate.

notfound

Acest atribut boolean are valoarea True în cazul în care nu a fost returnata nici o linie de catre instructiunea select into sau daca o instructiune insert, update sau delete nu a afectat nici o linie.

%found

Pâna în momentul executarii unei instructiuni SQL de manipulare a datelor, acest atribut are valoarea Nuli. Daca o instructiune insert, update sau delete afecteaza una sau mai multe linii, acesta ia valoarea True. în caz contrar, atributul % f ound ia valoarea False.

%rowcount

Acest atribut returneaza numarul de linii afectate de o instructiune insert, update sau delete sau numarul de linii returnate de o instructiune select into. Atributul % rowcount returneaza zero daca instructiunea SQL nu afecteaza sau nu returneaza nici o linie.

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:

La initierea ciclului, este executata în mod implicit o instructiune open

La fiecare parcurgere a ciclului este executata în mod implicit o instructiune fetch

La parasirea ciclului este executata în mod implicit o instructiune close

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

select cod_art, pret, cant from lista_articole

where cod_comanda = v_id_comanda;

begin    - deschidere implicita

for inreg_comanda in c_cursor loop - 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

Câmpurile unui cursor implicit au aceleasi nume ca si câmpurile corespunzatoare din instructiunea interogativa. Din aceasta cauza'apar probleme atunci când instructiunea interogativa contine o expresie. De exemplu, cum veti face referire la numele coloanei în urmatoarea interogare?

cursor is c_vanzari

select nr_agent_vanzari, (total_vanzari/12)*.015 from

lista_vanzari

În situatiile de acest gen, folositi un alias pentru a face referire la articolul (total vanzari *. 015 al listei select în exemplul urmator, este folosit acelasi cursor ca si în exemplul anterior, însa este declarat aliasul comision_vanzari

cursor is c_vanzari

select nr_agent_vanzari, (total_vanzari/12)*.015

comision_vanzari

from lista^vanzari

Din acest moment, puteti face pur si simplu referire la aliasul comision_vanzari

if comision_vanzari > 5000 then ...

Performantele cursoarelor

Viteza de executie a apelurilor din interiorul cursoarelor poate fi îmbunatatita prin ajustarea parametrului cursor_space_for time. Acest parametru precizeaza momentul în care o zona SQL partajata poate dealocata pentru a face loc unei noi instructiuni SQL. Valoarea prestabilita a acestui parametru este False. Acest lucru înseamna ca Oracle poate dealoca o zona SQL partajata din biblioteca cache chiar daca este deschis un cursor al unei aplicatii asociat cu instructiunile acesteia. Valoarea True înseamna ca o zona SQL partajata poate fi dealocata numai atunci când toate cursoarele aplicatiei asociate instructiunilor SQL ale acesteia sunt închise.

Daca valoarea acestui parametru este False, programul Oracle trebuie sa consume timp si resurse pentru a verifica daca zona SQL partajata care contine instructiunea SQL se gaseste în biblioteca cache. Stabilirea parametrului la valoarea True face ca serverul' sa realizeze o mica economie de timp si poate îmbunatati performantele apelurilor de executie. Aceasta deoarece programul Oracle nil trebuie sa verifice zona SQL partajata care nu poate fi dealocata atât timp cât un cursor al unei aplicatii este asociat cu ea.

Rezumat

Cursoarele sunt structuri PL/SQL care va permit sa procesati linie cu linie rezultatele unei interogari multi-linie. Cursoarele implicite sunt create pentru fiecare instructiune DML, în timp ce cursoarele explicite sunt create de utilizatori pentru procesarea interogarilor care returneaza linii multiple.

Cursoarele permit utilizatorului sa proceseze linie cu linie rezultatele unei interogari multi-linie. De asemenea, cursoarele îmbunatatesc procesarea codului prin eliminarea interpretarii repetate a 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 câteva aplicatii practice ale ambelor.




Document Info


Accesari: 6026
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. 2025 )