You are on page 1of 17

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic din Moldova


FCIM
Catedra Automatic i Tehnologii Inormaionale
!isciplina" #a$e de date i Cuno tin e
%ucrare de curs
Tema" Controlul e&plicit al cursoarelor
A elaborat" 'tudent grupa" TI ( )))
*oloceai +etru
A veriicat" %ector superior ,
#ulai Rodica
Chiinu -.)/
-
Cuprins:
Introducere 3
1 Cursoare. Operaii cu cursoare 4
1.1 Utilizarea cursoarelor 4
1.2 Crearea cursoarelor 4
1.3 Controlul explicit al cursorului - pa ii separati 5
1.3.1 Instruc i unea CURSOR 5
1.3.2 Instruc iu nea OP! "
1.3.3 Instruc i unea #$C% "
1.3.4 Instruc iu nea C&OS '
1.4 (tri)ute explicite pentru cursoare '
1.5 Controlul extra*erilor +ultiple din cursoare explicite '
1." Cursoarele si inre*istrarile ,
1.' #olosirea clauzei -%R CURR!$ O# .
1., Cursoare cu para+etri 1/
1.. Cicluri &OOP cursor 1/
1.1/ Cicluri #OR cursor cu para+etri 11
1.11 Su)expresii select 0n ciclurile #OR 12
2. xe+ple i concluzii 13
2.1 C1te2a cu2inte despre e3icien4 13
2.2 xe+ple co+entate 14
2.3 5nc6iderea cursoarelor 15
Concluzii: 1'
7i)lio*ra3ie: 1'
0
Introducere
1peraiile de regsire din '2% uncionea$ cu seturi de r3nduri cunoscute sub numele de
seturi de re$ultate, R4ndurile returnate sunt toate r4ndurile care corespund criteriilor de cutare
incluse 3ntr5o instruciune '2%6 3n numr de $ero sau mai multe, Folosind instruciuni 'E%ECT
simple6 nu e&ist nici o modalitate de a regsi primul r3nd6 r4ndul urmtor sau precedentele ).
r3nduri, Aceasta este o parte integrant a modului de uncionare a unui programde tip '7#!,
Uneori6 este necesar deplasarea printre r3nduri 3nainte sau 3napoi6 cu unul sau mai multe
r4nduri deodat, +entru aceasta se utili$ea$ cursoarele, Un cursor este o interogare de ba$e de
date stocat pe serverul '7#! ( nu o instruciune 'E%ECT6 ci setul de re$ultate regsit de
instruciunea respectiv, 1 dat cursorul stocat6 aplicaiile pot derula sau parcurge datele 3n sus i
3n 8os6 dup necesiti,
!ieritele programe de tip '7#! accept dierite opiuni i caracteristici ale cursoarelor,
+rintre cele mai comune se numr"
5 capacitatea de a desemna un cursor ca iind de tip read5onl9 :numai pentru citire;6
astel 3nc4t datele s poat i citite6 dar nu i actuali$ate sau t erse<
5 capacitatea de a controla operaiunile direcionale care pot i e&ecutate :3nainte6
3napoi6 primul6 ultimul6 po$iia absolut6 po$iia relativ etc,;<
5 capacitatea de a marca unele coloane ca iind editabile6 respectiv pe altele ca non5
editabile<
5 speciicarea domeniului de e&isten 6 pentru a avea posibilitatea de a pune cursorul la
dispo$iia unei anumite cereri care l5a creat :o procedur stocat6 de e&emplu; sau a
tuturor cererilor<
5 se poate indica programului '7#! s reali$e$e o copie a datelor regsite : i nu
indicarea spre datele reale din tabel; astel 3nc4t datele s nu se modiice 3ntre
momentul deschiderii cursorului i momentul accesului la acesta,
Cum se comport programele de tip '7#! relaional ca programe de tip '7#! non5
rela ional= Ca punct de reerin6 accesul i navigarea printre r4nduri 3n acest mod repre$in o
comportare a ba$elor de date de tip I'AM :Inde&ed 'e>uential Acces Method ( metod de acces
secvenial inde&at;6 ca de e&emplu #trieve i d#A'E, Cusoarele repre$int o parte interesant a
speciicaiei '2%6 3n sensul c pot determina o ba$ de date rela ional s se comporte ca o ba$
de date I'AM,
Cursoarele se olosesc cu precdere de ctre aplicaiile interactive6 3n cadrul crora
utili$atorul trebuie s se deplase$e 3n sus i 3n 8os cu unul sau mai multe ecrane de date6 navig4nd
sau eectu4nd modiicri,
Cursoarele nu sunt de prea mare a8utor 3n ca$ul aplicaiilor cu suport ?eb :A'+6
ColdFusion6 +@+ i A'+6 de e&emplu;, Cursoarele sunt proiectate s persiste pe durata sesiunii
dintre aplicaiile client i server6 dar acest model clientBserver nu5 i are loc 3n lumea aplicaiilor
?eb6 deoarece serverul de aplicaie este clientul de ba$e de date6 nu utili$atorul inal, Cn
consencin6 ma8oritatea de$voltatorilor de aplicaii ?eb evit utili$area cursoarelor i re5creea$
singuri aceast uncionalitate6 dac este necesar,
/
1 Cursoare. Operaii cu cursoare
Cursoarele e&eplicite pot i utili$ate pentru a re$olva multiple e&trageri, Capitolul care
urmea$ va demonstra utilitatea cursoarelor6 va parcurge crearea unui cursor i instruciunile
respective,
1.1 Utilizarea cursoarelor
Utili$area cursoarelor implic numeroase etape distincte"
5 Cnainte de a i utili$at6 un cursor trebuie declarat, Acest proces nu regse te propriu5
$is datele6 ci nu ace dec4t s deineasc instruciunea 'E%ECT care va i utili$at i
eventualele op iuni privind cursoarele<
5 1 dat declarat6 cursorul trebuie deschis 3n vederea utili$rii, Acest proces este cel
care regse te eectiv datele6 olosind instruciunea 'E%ECT deinit anterior<
5 Ulterior populrii cursorului cu date6 pot i regsite r4nduri individuale6 conorm
necesitilor <
5 C4nd nu mai este nevoie de el6 cursorul trebuie 3nchis i eventual eliberat :3n uncie
de '7#!;,
1 dat declarat un cursor6 poate i deschis i 3nchis de oric4te ori este necesar, !up
deschiderea cursorului6 operaiile de regsire se pot eectua cu recven a do rit,
1.2 Crearea cursoarelor
Cursoarele se declar olosind instruciunea !EC%ARE6 care dier de la un '7#! la
altul, !EC%ARE denume te cursorul i preia o instruciune 'E%ECT6 care poate conine
?@ERE i alte clau$e6 conorm necesitilor, +entru a demonstra aceasta6 com crea un cursor
care regse te pe toi clienii r adrese de email care lipsesc,
Iat versiunea !#-6 '2% 'erver6 i '9base"
DECLARE ClientCursor CURSOR
FOR
SELECT * FROM Clienti
WHERE email_client IS NULL
Aceasta este versiunea 1racle i +ostgre'2%"
D
DECLARE CURSOR ClientCursor
IS
SELECT * FROM Clienti
WHERE email_client IS NULL
Cn ambele versiuni6 instruciunea !EC%ARE este utili$at la deinirea i denumirea
cursorului ( 3n acest ca$ Client5Cursor, Instruciunea 'E%ECT deinete un cursor care conine
toi clien ii r adres de email :o valoare EU%%;,
1.3 Controlul explicit al cursorului - pa ii separati
Cursorul e&plicit poate i controlat prin / tipuri separate de aciuni"
DECLARE :numeste cursorul i deine te structura interogrii care s ie eectuate cu el,
%a acest nivel6 interogarea este parcurs dar nu este e&ecutat;<
1+EE :e&ercut interogarea6 leg4nd orice variabil care a ost reereniat, %iniile
3ntoarse de interogare6 numita Fset5activF sunt acum disponibile pentru e&tragere;<
FETC@ :memorea$a valorile din linia curent 3n variabile, %inia curent este linia la care
cursorul pointea$, Fiecare FETC@ produce mutarea cursorului s indice la linia urmtoare 3n
setul activ6 i de ci iecare FETC@ va accesa o linie dierit returnat de interogare;<
C%1'E :porne te un set de lucru de linii produse de 1+EE5ul cursorului, Este posibil s
re1+EE :redeschide i; cursorul6 stabilind astel un set de lucru nou;,
1.3.1 Instruc i unea CURSOR
Este olosit pentru a declara un cursor e&plicit, +arametrii pot i deinii pentru a permite
substitu ia valorilor in interogare c4nd cursorul este deschis, *ariabilele pot i deasemenea
reerite 3n interogare6 dar trebuie sa ie declarate 3naintea instruciunii CUR'1R,
'inta&a"
CURSOR ienti!icator"# $arameter etails%& IS 'uer()
e*$ression+
unde >uer95e&pression este o instruciune 'E%ECT care poate include ma8oritatea
clau$elor6 dar nu o clau$a IET1, Eu trebuie deinit EU%% ca un obiect 'E%ECT,
E&emplu "
G
DECLARE
CURSOR c, IS
SELECT ename- sal- .ireate FROM em$
WHERE e$tno/ 01 AND 2o3/ 4ANAL5ST4+
1.3.2 Instruc iu nea OP!
Este utili$at 3n cadrul aciunilor e&ecutabile dintr5un bloc6 ea stabile te un set activ de
r4nduri,
'inta&a"
O6EN cursor)ienti! "#lista ar7umente%& +
E&emplu"
O6EN c,+
Cursorul va pointa ctre primul r4nd 3n setul activ6 ca de e&emplu"
8 SCOTT 9111 ,:)2an);1
FORD 9111 19)ec)<,
!e observat c e&cepiile nu sunt lansate dac cererea nu 3ntoarce nici un r4nd c4nd este
deschis cursorul, 'tarea cursorului poate6 totu i6 s ie testat dup un FETC@,
1.3.3 Instruc i unea #$C%
Este utili$at pentru a e&trage r4ndul curent 3ntr5o variabil +%B'2%6 sau 3ntr5o variabil
host6 inclusiv c4mpurile ecran din '2%Horms, Trebuie de amintit c variabilele host necesit
punct5virgul ca prei&6 pentru a i deosebite de variabilele +%B'2%,
'inta&a"
FETCH cursor)i INTO =ar-=ar->>> +
*ariabilele trebuie sa ie speciicate pentru iecare c4mp selectat 3n cererea de cursor, 1
alt posibilitate este deinirea unei 3nregistrri pentru cursor6 i transmiterea sa ca o clau$a a
FETC@,
E&emplu"
FETCH c, INTO =_ename- =_sat- =_.ireate+
*ariabilele 3ncrcate6 care au ost declarate 3nainte de FETC@6 pot i manipulate de alte
instruciuni, FETC@5uri ulterioare vor achi$iiona alte r4nduri individuale din cerere, !e notat c
primul FETC@ care nu obine nimic6 adica dac nu mai ram4n r4nduri6 nu va cau$a o eroare,
*ariabilele vor conine valori nule,
I
1.3.4 Instruc iu nea C&OS
Inchide 3n mod e&plicit un cursor6 permi 4nd redeschiderea sa ulterioar, Aceasta
inseamn c un set activ poate i restabilit de mai multe ori,
'inta&a"
CLOSE cursor)ienti! +
1.4 (tri)ute explicite pentru cursoare
Ca i la cursoarele implicite6 e&ist / atribute pentru a obine inormaii de stare despre
cursoare, C4nd s4nt utili$ate6 numele atributului este precedat de identiicatorul cursorului,
JF1UE! 5 evaluat la TRUE dac ultimul FETC@ din cursor a obinut un nou r4nd6
altel FA%'E<
JE1TF1UE! 5 invers ca JF1UE!<
JR1?C1UET 5 numrul de r4nduri preluate de la cursor p4na acum<
JI'1+EE 5 TRUE dac cursorul este deschis6 FA%'E dac a ost 3nchis sau nu a ost
3nca deschis,
E&emple"
,> IF c,?ISO6EN THEN
FETCH c, INTO =_ename- =_sal- =_.ireate +
ELSE
O6EN c,+
0> LOO6
FETCH c, INTO =_ename- =_sal- =_.ireate +
E@IT WHEN c,?ROWCOUNT 8,1 +
END LOO6+
1.5 Controlul extra*erilor +ultiple din cursoare explicite
In mod normal6 c3nd mai multe r4nduri s4nt prelucrate dintr5un cursor e&plicit6 un ciclu
trebuie deinit pentru a e&ecuta FETC@ la iecare iteraie, !ac acest proces continu6 se vor
prelucra eventual toate r4ndurile active, C4nd un FETC@ euea$6 atributul JE1TF1UE! este
TRUE6 i poate i testat, Totu i dac dup aceasta se eectuea$a un nou FETC@ apare o eroare"
ORA),110A Fetc. out o! se'uence
K
Aceast eroare va termina blocul6 eventual cu o e&cepie netratat, Este deci important s
se veriice succesul iecarui FETC@ 3nainte de alte reeriri la cursor :ie prin alte FETC@ sau
comen$i '2%;,
E&emplu"
O6EN cursor_, +
LOO6
FETCH cursor, INTO a-3-c- +
E@IT WHEN cursor,?NOTFOUND +
END LOO6+
1." Cursoarele si inre*istrarile
Am v$ut de8a c 3nregistrrile pot i deinite sa se potriveasc cu structura coloanelor
unui tabele, Este de asemenea posibil s deinim 3nregistrri ba$ate pe lista de coloane selectat
e&plicit de cursor, Aceasta este convenabil pentru prelucrarea r3ndurilor din setul activ6 pentru ca
s se poat e&trage direct 3n 3nregistrare6 i valorile r4ndului vor i 3ncarcate direct 3n c4mpurile
corespun$atoare ale inregistrrii,
E&emplu"
DECLARE
CURSOR c, IS
SELECT em$no- sal- .ireate- roBi
FROM em$ WHERE e$tno / 01 AND 2o3 / CANAL5STC
FOR U6DATE OF sal+
em$_recor c,?ROWT56E+
DEEIN
O6EN c,+
FETCH c, INTO em$_recor+
IF em$_recor>sal F0111 THEN >>>
!e observat ca pseudo5coloana LroMidL este valid ca articol selectabil i d eci va avea un
c4mp corespun$ator 3n 3nregistrarea LempNrecordL,
E&emplul de mai sus arat deasemenea utili$area F1R U+!ATE 3ntr5o cerere cu cursor,
Aceasta 3nseamna c r4ndurile 3ntoarse de cerere s4nt blocate e&clusiv c4nd instruciunea 1+EE
este e&ecutat, !eoarece blocrile s4nt eliberate la sir itul unei tran$acii6 nu trebuie sa e&ecuta i
C1MMIT 3ntre e&tragerile dintr5un cursor e&plicit dac se olose te F1R U+!ATE,
O
1.' #olosirea clauzei -%R CURR!$ O#
C4nd ne reerim la r4ndul5curent dintr5un cursor e&plicit6 comen$ile '2% pot olosi
?@ERE CUR'1R 1F6 cu numele cursorului, Aceasta permite actuali$area sau tergerea 3n
punctul 3n care ne alm6 r a i necesar olosirea e&plicit a RoMid, Trebuie totu i s in clude i
F1R U+!ATE 3n cererea cursorului6 astel 3nc4t r4ndurile s ie blocate la deschidere,
E&emplu"
FETCH c, INTO em$_recor +
IF em$_recor>ename / C GINEC THEN
DELETE FROM em$ WHERE CURRENT OF c,+
'a luam un e&emplu comlet, Cn blocul de mai 8os se prelucrea$a iecare r4nd din tabela
LdepL6 mut4nd departamentul 'A%E' 3n locaia !allas i celelalte departamente la EeM PorQ, !e
asemenea se ine un contor al departamentelor plasate 3n iecare loca ie,
DECLARE
CURSOR c, IS
SELECT name- loc FROM e$t
FOR U6DATE OF loc +
e$t_rec c,?ROWT56E+
sales_count NUMDERA/1 +
non_sales NUMDER A/ 1+
DEEIN
O6EN c,+
LOO6
FETCH c, INTO e$t_rec+
E@IT WHEN c,?NOTFOUND+
IF e$t_rec>name / CSALESC AND e$t_rec>loc H/ CDALLASC
THEN
U6DATE e$t SET loc / CDALLASC WHERE
CURRENT OF c,+
sales_count A/ sales_count I ,+
ELSIF e$t_rec>name H/ CSALESC AND e$t_rec>loc H/ CNEW
5ORGC
THEN
U6DATE e$t SET loc / CNEW 5ORGC WHERE CURRENT OF c,+
non_sales A/ non_sales I, +
END IF+
END LOO6+
CLOSE c,+
INSERT INTO counts #sales_set- non_sales_set %
JALUES #sales_count- non_sales%+
COMMIT+
END+
).
1., Cursoare cu para+etri
+arametrii permit transmiterea unor valori unui cursor c4nd acesta este deschis i
utili$area 3n cererile care se e&ecut,
Aceasta 3nseamn c un cursor e&plicit poate i deschis de mai multe ori 3ntr5un bloc6
3ntorc4nd seturi de lucru dierite cu iecare oca$ie,
+arametrii s4nt deini i 3n instruciunea CUR'1R astel"
CURSOR ienti! # $aram)name ata)t($e- $aram)name ate)
t($e- >>> % IS 'uer()e*$resion+
Tipurile parametrilor s4nt acelea i cu ale variabilelor scalare6 dar nu primesc dimensiune,
Eumele parametrilor sunt pentru reerire 3n cadrul e&presiei de cerere din cadrul cursorului i pot
i tratate ca variabile +%B'2%, Urmtorul e&emplu arat numrul departamentului i t ipul 8obului
care sunt transmise 3ntr5o clau$a ?@ERE prin parametrii +aram) i +aram-"
CURSOR c, # 6aram, NUMDER-
6aram0 CHAR % IS SELECT ename- sal- .ireate
FROM em$
WHERE e$tno / 6aram,
AND
2o3 / 6aram0+
C4nd cursorul este ulterior deschis6 valorile sunt transmise pentru iecare din parametrii
3n mod po$iional, *alorile din +%B'2% sau variabile host pot i utili$ate i deasemenea ca litere,
E&emplu"
O6EN c, #91- CANAL5STC%+
O6EN c, #$l_num- CCLERGC%+
O6EN c, #,1- 2o3_t($e%+ )) 2o3_t($e este o =aria3ila 6LKSLL
1.. Cicluri &OOP cursor
+%B'2% oer un tip special de ciclu F1R pentru a prelucra r4ndurile 3ntoarse 3n cursorul
e&plicit, Cntr5un ciclu F1R cursor6 un cursor declarat este deschis6 se eectuea$a e&trageri i este
inchis automat c4nd toate r4ndurile au ost prelucrate, Fiecare iteraie a ciclului e&trage un r4nd
din setul activ 3ntr5o 3nregistrare6 care este declarat implicit pentru utili$are 3n cadrul ciclului,
Ciclul este terminat automat la sir i tul iteraiei pentru ultimul r4nd e&tras,
Ciclurile F1R cu cursor sunt structurate astel"
))
DECLARE
CURSOR cursor_name " #$arameters%& IS 'uer()e*$resion+
DEEIN
FOR recor)name IN cursor)name " #$arameters% &
LOO6
))$rocesare =alori in rinul curent>
END LOO6+
Cnregistrarea numit 3n instruciunea F1R este declarat intern 3n ciclu i valabilitatea ei
e&pir c4nd se termin ciclul, Fiecare iteraie provoac e&tragerea r4ndului urmtor din
3nregistrare, !eoarece cursorul este declarat e&plicit 3n bloc6 atributele sale sunt disponibile 3n
cadrul ciclului pentru testare6 dac este necesar,
E&emplu"
DECLARE
CURSOR c, IS SELECT n,- n0- n9 FROM ata_ta3le+
result NUMDER+
DEEIN
FOR rec IN c, LOO6
result A/ rec>n0 K #rec>n, I rec>n9%+
INSERT INTO tem$_ta3 JALUES #result%+
END LOO6+
COMMIT+
END+
1.1/ Cicluri #OR cursor cu para+etri
!ac cursorul pe care 3l procesa i 3ntr5un ciclu F1R cursor a ost deinit cu parametrii6
valorile :parametrii actuali; sunt date 3n parante$6 dup numele cursorului 3n instruciunea F1R,
CURSOR c, #6aram, DATE % IS
SELECT ename- 2o3 FROM em$
WHERE .ireate F 6aram, +
DEEIN
FOR em$_recor IN c, #C1,)MAN);0C%
LOO6
)) =or !i acti=i an7a2atii e u$a ian;0
END LOO6+
)-
1.11 Su)expresii select 0n ciclurile #OR
Am v$ut c ciclurile F1R cu cursor sunt un mod convenabil de a prelucra r4nduri dintr5
un cursor e&plicit declarat 3n program, Ciclurile F1R pot i deasmenea utili$ate pentru a prelucra
cereri multi5r4nd6 care sunt deinite la inceputul ciclului, 'tructura este aratat mai 8os"
FOR rec)name IN #'uer()e*$resion%
LOO6
END LOO6+
E&presia cererii este considerat ca o sub5e&presie i este prelucrat 3ntr5un cursor care
este intern ciclului F1R, !eoarece cursoarele nu sunt declarate cu nume6 atributele cursoarelor
nu sunt disponibile pentru testare, Cn aar c este mai simplu de scris6 aceast metod este i
mult mai eicient,
E&emplu"
FOr rec IN #SELECT ename FROM em$ WHERE e$tno / ,1 %
LOO6
IF rec>ename / CMONESC THEN
END LOO6+
)0
2. xe+ple i concluzii
Cn capitolul ce urmea$ vor i cute conclu$iile i pr e$entate c4teva e&emple,
2.1 C1te2a cu2inte despre e3icien4
To i actorii care inluenea$a perorman a unui program '2% se aplic i la
+%B'2%, Ace t ia includ"
5 Inde&area coloanelor olosite 3n ?@ERE i 3n 8oin<
5 +rei&area coloanelor cu numele tabelei<
5 Cn 8oinurile inde&ate6 reerirea la tabela cea mai mic de la s4r it,
Cn plus6 +%B'2% mai oera uncionalitate care ace instruciunile '2% nenecesare,
5 Eu accesa i ba$a de date dac nu este necesar<
5 !ac toate datele de prelucrat sunt stocate 3n variabile6 atunci olosii construcii
+%B'2% ca atribuire sau IF, Eu olosii 'E%ECT,,FR1M 'P',!UA% in mediul
+%B'2%6 deoarece produce deschiderea unui cursor i transmiterea unor cereri ctre
R!#M'<
5 Eectua i calcule 3n 'E%ECT6 dac este posibil<
5 !ac ave i de eectuat prelucrri este mult mai eicient s le eectuai atunci c4nd
'E%ECT5a i date i evit a i instruciuni ulterioare care ar i necesare<
5 Cursoarele e&plicite vor permite evitarea unui FETC@ ulterior<
5 Atunci c4nd un singur r4nd este necesar6 cursoarele implicite e&ecut dou e&trageri<
5 Un cursor e&plicit va permite sa eectuai o singura e&tragere<
5 Evita i treceri repetate prin tabele,
+relucrarea procedural permite un control puternic i le&ibil al r4ndurilor ba$ei de date6
dar trebuie s ineti cont c iecare IE'ERT i U+!A TE provoac re5scanarea tabelei, !ac
prelucrati mai multe r4nduri dintr5o tabela6 3ncerca i s o ace i 3ntr5un singur pas,
Considerati situaia urmtoare, !orim s marim costul iecarui articol din tabel LitemsL6 pe
r4nd6 p4na c4nd suma depae te D..., Cn primul e&emplu6 o scanare a tabelei este utili$at de
iecare dat pentru a recalcula totalul c4nd un articol este actuali$at"
WHILE total F N111
LOO6
FETCH item_cursor INTO ol_cost+
U6DATE items SET itemcost / itemcost *,>,
WHERE CURRENT OF item_cursor+
SELECT SUM#itemcost% INTO total FROM items+
END LOO6+
1 atribuire ar putea evita L'E%ECT 'UML la iecare iteraie6 calcul4nd c4t de mult totalul
ar i aectat de ultima actuali$are"
)/
WHILE total F N111
LOO6
FETCH item_cursor INTO ol_cost+
U6DATE items SET itemcost / itemcost *,>,
WHERE CURRENT OF item_cursor+
tottal A/ total I ol_cost *1>,+
END LOO6+
2.2 xe+ple co+entate
r4nd;"
+rimul e&emplu olose te sinta&a 1racle pentru a regsi un singur r4nd din cursor :primul
DECLARE T56E ClientCursor IS REF CURSOR
RETURN Clienti?ROWT56E+
DECLARE ClientInre7istrare Clienti?ROWT56E
DEEIN
O6EN ClientCursor+
FETCH ClientCursor INTO ClientInre7istrare+
CLOSE ClientCursor+
END+
Cn acest e&emplu6 instruciunea FETC@ este utili$at la regsirea r4ndului curent :va
porni6 3n mod automat6 de la primul r4nd; 3ntr5o variabil declarat6 numit ClientInregistrare,
!atele regsite nu sunt prelucrate 3n nici un mod,
Cn e&emplul urmtor :care olose te din nou sinta&a 1racle;6 datele regsite sunt parcurse
ciclic6 de la primul r4nd la ultimul"
DECLARE T56E ClientCursor IS REF CURSOR
RETURN Clienti?ROWT56E+
DECLARE ClientInre7istrare Clienti?ROWT56E
DEEIN
O6EN ClientCursor+
LOO6
FETCH ClientCursor INTO ClientInre7istrare+
E@IT WHEN ClientCursor?NOTFOUND+
>>>
END LOO6+
CLOSE ClientCursor+
END+
Ca i 3n e&emplul precedent6 acest e&emplu olose te instruciunea FETC@ pentru a
regsi r4ndul curent 3ntr5o variabil declarat6 numit ClientInregistrare, 'pre deosebire de
e&emplul precedent6 aici instruciunea FETC@ se gse te 3n interiorul unui ciclu :%11+;6 astel
3nc4t se e&ecut 3n mod repetat, %inia de program ERIT ?@EE ClientCursorJE1TF1UE!
determin 3ncheierea prelucrrii :inali$area ciclului; atunci c4nd nu mai e&ist alte r4nduri de
preluat, Cn acest e&emplu nu se e&ecut o prelucrare eectiv< 3ntr5un program autentic ve i
3nlocui caracterele ,,, cu propriile dumneavoastra linii de program,
Iat un alt e&emplu6 care de data aceasta olose te sinta&a Microsot '2% 'erver"
DECLARE Oi_client CHAR#,1%-
Onume_client CHAR#N1%-
Oaresa_client CHAR#N1%-
Ooras_client CHAR#N1%-
Ostat_client CHAR#N%-
Oco_$ostal_client CHAR#,1%-
Otara_client CHAR#N1%-
Ocontact_client CHAR#N1%-
Oemail_client CHAR#0NN%-
O6EN ClientCursor
FETCH NE@T FROM ClientCursor
INTO Oi_client- Onume_client- Oaresa_client- Ooras_client-
Ostat_client- Oco_$ostal_client- Otara_client- Ocontact_client-
Oemail_client
WHILE OOFETCH_STATUS / 1
DEEIN
>>>
FETCH NE@T FROM ClientCursor
INTO Oi_client- Onume_client- Oaresa_client- Ooras_client-
Ostat_client- Oco_$ostal_client- Otara_client- Ocontact_client-
Oemail_client
END
CLOSE ClientCursor
Cn acest e&emplu6 sunt declarate variabile pentru iecare dintre coloanele regsite6 iar
instruciunile FETC@ regsesc un r4nd i salvea$ valorile 3n variabilele respective, 'e olose te
un ciclu ?@I%E pentru a parcurge r4ndurile6 iar condiia ?@I%E S S F ETC@N'TA T U' T .
determin 3ncheierea prelucrrii :prsirea ciclului; atunci c4nd nu mai sunt r4nduri de preluat,
!in nou6 3n acest e&emplu nu se e&ecut prelucrri ale datelor< 3ntr5un program real ve i 3nlocui
caracterele ,,, cu propriile dumneavoastr linii de program,
2.3 5nc6iderea cursoarelor
A a cum s5a men ionat i s5a v$ut 3n e&emplele precedente6 cursoarele trebuie 3nchise
dup utili$are, !e asemenea6 unele programe de tip '7#! :precum '2% 'erver; impun ca
resursele olosite de cursor s ie 3n mod e&plicit eliberate, Iat sinta&a olosit 3n !#6 1racle6 i
+ostgre'2%"
CLOSE ClientCursor
Iat versiunea Microsot '2% 'erver "
CLOSE ClientCursor
DEALLOCATE CURSOR ClientCursor
Instruciunea C%1'E este olosit la 3nchiderea cursoarelor< odat 3nchis un cursor6
acesta nu mai poate i reolosit r a i deschis din nou, Cu toate acestea6 un cursor nu trebuie s
ie declarat din nou pentru a i olosit< o instruciune 1+EE este suicient,
Concluzii:
Eectu4nd lucrarea de curs dat6 a ost cut o pre$entare a temei cursoarele, Astel a ost
selectat inorma ia la tem i structurat6 pre$ent4ndu5se e&emple 3n dierite '7#! precum
1racle sau Microsot '2% 'erver,
Un cursor repre$int o $on de memorie 3n care se reine o instruciune '2% anali$at i
inormaii utile procesrii acesteia, 'istemul 1racle gestionea$ 3n mod automat cursoarele, Cn
de$voltarea unei aplicaii6 un cursor constituie o resurs disponibil care poate i utili$at pentru
anali$area sintactic i semantic e&plicit a instruciunilor '2% 3ncapsulate 3n aplicaie,
E&ecuia unui cursor plasea$ re$ultatul cererii asociate 3ntr5o mulime de linii :mulime
re$ultat;6 care pot i regsite secvenial sau nesecvenial,
7i)lio*ra3ie:
U)V Sams teach yourself sql in 10 minutes. :-..I;, Teora U'A %%C,
U-V Catedra de Calculatoare6 F, d, :-.)-6 aprilie .G;, ht t p : // adisof t are. !" .ro. +reluat de
pe adisotMare,