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,