Lucrare De Curs Bdc

  • Uploaded by: Petru Voloceai
  • 0
  • 0
  • March 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Lucrare De Curs Bdc as PDF for free.

More details

  • Words: 3,504
  • Pages: 17
Loading documents preview...
Ministerul Educaţiei al Republicii Moldova Universitatea Tehnică din Moldova FCIM Catedra Automatică şi Tehnologii Informaţionale

Disciplina: Baze de date și Cunoștințe

Lucrare de curs

Tema: Controlul explicit al cursoarelor

A elaborat:

Student grupa: TI – 111 Voloceai Petru

A verificat:

Lector superior Bulai Rodica

Chișinău 2014

.

Cuprins: Introducere

3

1 Cursoare. Operații cu cursoare 1.1 Utilizarea cursoarelor 1.2 Crearea cursoarelor 1.3 Controlul explicit al cursorului - pașii separati 1.3.1 Instrucțiunea CURSOR 1.3.2 Instrucțiunea OPEN 1.3.3 Instrucțiunea FETCH 1.3.4 Instrucțiunea CLOSE 1.4 Atribute explicite pentru cursoare 1.5 Controlul extragerilor multiple din cursoare explicite 1.6 Cursoarele si inregistrarile 1.7 Folosirea clauzei WHERE CURRENT OF 1.8 Cursoare cu parametri 1.9 Cicluri LOOP cursor 1.10 Cicluri FOR cursor cu parametri 1.11 Subexpresii select în ciclurile FOR

4 4 4 5 5 6 6 7 7 7 8 9 10 10 11 12

2. Exemple și concluzii 2.1 Câteva cuvinte despre eficiență 2.2 Exemple comentate 2.3 Închiderea cursoarelor

13 13 14 15

Concluzii:

17

Bibliografie:

17

2

Introducere Operațiile de regăsire din SQL funcționează cu seturi de rînduri cunoscute sub numele de seturi de rezultate. Rândurile returnate sunt toate rândurile care corespund criteriilor de căutare incluse într-o instrucțiune SQL, în număr de zero sau mai multe. Folosind instrucțiuni SELECT simple, nu există nici o modalitate de a regăsi primul rînd, rândul următor sau precedentele 10 rînduri. Aceasta este o parte integrantă a modului de funcționare a unui programde tip SGBD. Uneori, este necesară deplasarea printre rînduri înainte sau înapoi, cu unul sau mai multe rânduri deodată. Pentru aceasta se utilizează cursoarele. Un cursor este o interogare de baze de date stocată pe serverul SGBD – nu o instrucțiune SELECT, ci setul de rezultate regăsit de instrucțiunea respectivă. O dată cursorul stocat, aplicațiile pot derula sau parcurge datele în sus și în jos, după necesități. Diferitele programe de tip SGBD acceptă diferite opțiuni și caracteristici ale cursoarelor. Printre cele mai comune se numără: - capacitatea de a desemna un cursor ca fiind de tip read-only (numai pentru citire), astfel încât datele să poată fi citite, dar nu și actualizate sau șterse; - capacitatea de a controla operațiunile direcționale care pot fi executate (înainte, înapoi, primul, ultimul, poziția absolută, poziția relativă etc.); - capacitatea de a marca unele coloane ca fiind editabile, respectiv pe altele ca noneditabile; - specificarea domeniului de existență, pentru a avea posibilitatea de a pune cursorul la dispoziția unei anumite cereri care l-a creat (o procedură stocată, de exemplu) sau a tuturor cererilor; - se poate indica programului SGBD să realizeze o copie a datelor regăsite (și nu indicarea spre datele reale din tabel) astfel încât datele să nu se modifice între momentul deschiderii cursorului și momentul accesului la acesta. Cum se comportă programele de tip SGBD relațional ca programe de tip SGBD nonrelațional? Ca punct de referință, accesul și navigarea printre rânduri în acest mod reprezină o comportare a bazelor de date de tip ISAM (Indexed Sequential Acces Method – metodă de acces secvențial indexat), ca de exemplu Btrieve și dBASE. Cusoarele reprezintă o parte interesantă a specificației SQL, în sensul că pot determina o bază de date relațională să se comporte ca o bază de date ISAM. Cursoarele se folosesc cu precădere de către aplicațiile interactive, în cadrul cărora utilizatorul trebuie să se deplaseze în sus și în jos cu unul sau mai multe ecrane de date, navigând sau efectuând modificări. Cursoarele nu sunt de prea mare ajutor în cazul aplicațiilor cu suport Web (ASP, ColdFusion, PHP și JSP, de exemplu). Cursoarele sunt proiectate să persiste pe durata sesiunii dintre aplicațiile client și server, dar acest model client/server nu-și are loc în lumea aplicațiilor Web, deoarece serverul de aplicație este clientul de baze de date, nu utilizatorul final. În consencință, majoritatea dezvoltatorilor de aplicații Web evită utilizarea cursoarelor și re-creează singuri această funcționalitate, dacă este necesar.

3

1 Cursoare. Operații cu cursoare Cursoarele exeplicite pot fi utilizate pentru a rezolva multiple extrageri. Capitolul care urmează va demonstra utilitatea cursoarelor, va parcurge crearea unui cursor și instrucțiunile respective.

1.1 Utilizarea cursoarelor Utilizarea cursoarelor implică numeroase etape distincte: - Înainte de a fi utilizat, un cursor trebuie declarat. Acest proces nu regăsește propriuzis datele, ci nu face decât să definească instrucțiunea SELECT care va fi utilizată și eventualele opțiuni privind cursoarele; - O dată declarat, cursorul trebuie deschis în vederea utilizării. Acest proces este cel care regăsește efectiv datele, folosind instrucțiunea SELECT definită anterior; - Ulterior populării cursorului cu date, pot fi regăsite rânduri individuale, conform necesităților ; - Când nu mai este nevoie de el, cursorul trebuie închis și eventual eliberat (în funcție de SGBD). O dată declarat un cursor, poate fi deschis și închis de oricâte ori este necesar. După deschiderea cursorului, operațiile de regăsire se pot efectua cu frecvența dorită.

1.2 Crearea cursoarelor Cursoarele se declară folosind instrucțiunea DECLARE, care diferă de la un SGBD la altul. DECLARE denumește cursorul și preia o instrucțiune SELECT, care poate conține WHERE și alte clauze, conform necesităților. Pentru a demonstra aceasta, com crea un cursor care regăsește pe toți clienții fără adrese de email care lipsesc. Iată versiunea DB2, SQL Server, și Sybase: DECLARE ClientCursor CURSOR FOR SELECT * FROM Clienti WHERE email_client IS NULL Aceasta este versiunea Oracle și PostgreSQL:

4

DECLARE CURSOR ClientCursor IS SELECT * FROM Clienti WHERE email_client IS NULL În ambele versiuni, instrucțiunea DECLARE este utilizată la definirea și denumirea cursorului – în acest caz Client-Cursor. Instrucțiunea SELECT definește un cursor care conține toți clienții fără adresă de email (o valoare NULL).

1.3 Controlul explicit al cursorului - pașii separati Cursorul explicit poate fi controlat prin 4 tipuri separate de acțiuni: DECLARE (numeste cursorul și definește structura interogării care să fie efectuate cu el. La acest nivel, interogarea este parcursă dar nu este executată); OPEN (exercută interogarea, legând orice variabilă care a fost referențiată. Liniile întoarse de interogare, numita "set-activ" sunt acum disponibile pentru extragere); FETCH (memoreaza valorile din linia curentă în variabile. Linia curentă este linia la care cursorul pointează. Fiecare FETCH produce mutarea cursorului să indice la linia următoare în setul activ, și deci fiecare FETCH va accesa o linie diferită returnată de interogare); CLOSE (pornește un set de lucru de linii produse de OPEN-ul cursorului. Este posibil să reOPEN (redeschideți) cursorul, stabilind astfel un set de lucru nou).

1.3.1 Instrucțiunea CURSOR Este folosită pentru a declara un cursor explicit. Parametrii pot fi definiți pentru a permite substituția valorilor in interogare când cursorul este deschis. Variabilele pot fi deasemenea referite în interogare, dar trebuie sa fie declarate înaintea instrucțiunii CURSOR. Sintaxa: CURSOR identificator[( parameter details)] IS queryexpression; unde query-expression este o instrucțiune SELECT care poate include majoritatea clauzelor, dar nu o clauza INTO. Nu trebuie definit NULL ca un obiect SELECT. Exemplu :

5

DECLARE CURSOR c1 IS SELECT ename, sal, hiredate FROM emp WHERE deptno= 20 AND job= "ANALYST";

1.3.2 Instrucțiunea OPEN Este utilizată în cadrul acțiunilor executabile dintr-un bloc, ea stabilește un set activ de rânduri. Sintaxa: OPEN cursor-identif [(lista argumente)] ; Exemplu: OPEN c1; Cursorul va pointa către primul rând în setul activ, ca de exemplu: > SCOTT 3000 16-jan-90 FORD 3000 03-dec-81 De observat că excepțiile nu sunt lansate dacă cererea nu întoarce nici un rând când este deschis cursorul. Starea cursorului poate, totuși, să fie testată după un FETCH.

1.3.3 Instrucțiunea FETCH Este utilizată pentru a extrage rândul curent într-o variabilă PL/SQL, sau într-o variabilă host, inclusiv câmpurile ecran din SQL*forms. Trebuie de amintit că variabilele host necesită punct-virgulă ca prefix, pentru a fi deosebite de variabilele PL/SQL. Sintaxa: FETCH cursor-id INTO var,var,... ; Variabilele trebuie sa fie specificate pentru fiecare câmp selectat în cererea de cursor. O altă posibilitate este definirea unei înregistrări pentru cursor, și transmiterea sa ca o clauza a FETCH. Exemplu: FETCH c1 INTO v_ename, v_sat, v_hiredate; Variabilele încărcate, care au fost declarate înainte de FETCH, pot fi manipulate de alte instrucțiuni. FETCH-uri ulterioare vor achiziționa alte rânduri individuale din cerere. De notat că primul FETCH care nu obține nimic, adica dacă nu mai ramân rânduri, nu va cauza o eroare. Variabilele vor conține valori nule.

6

1.3.4 Instrucțiunea CLOSE Inchide în mod explicit un cursor, permițând redeschiderea sa ulterioară. Aceasta inseamnă că un set activ poate fi restabilit de mai multe ori. Sintaxa: CLOSE cursor-identif ;

1.4 Atribute explicite pentru cursoare Ca și la cursoarele implicite, există 4 atribute pentru a obține informații de stare despre cursoare. Când sânt utilizate, numele atributului este precedat de identificatorul cursorului. %FOUND - evaluat la TRUE dacă ultimul FETCH din cursor a obținut un nou rând, altfel FALSE; %NOTFOUND - invers ca %FOUND; %ROWCOUNT - numărul de rânduri preluate de la cursor pâna acum; %ISOPEN - TRUE dacă cursorul este deschis, FALSE dacă a fost închis sau nu a fost înca deschis. Exemple: 1. IF c1%ISOPEN THEN FETCH c1 INTO v_ename, v_sal, v_hiredate ; ELSE OPEN c1; 2. LOOP FETCH c1 INTO v_ename, v_sal, v_hiredate ; EXIT WHEN c1%ROWCOUNT >10 ; END LOOP;

1.5 Controlul extragerilor multiple din cursoare explicite In mod normal, cînd mai multe rânduri sânt prelucrate dintr-un cursor explicit, un ciclu trebuie definit pentru a executa FETCH la fiecare iterație. Dacă acest proces continuă, se vor prelucra eventual toate rândurile active. Când un FETCH eșuează, atributul %NOTFOUND este TRUE, și poate fi testat. Totuși dacă după aceasta se efectueaza un nou FETCH apare o eroare: ORA-1002: Fetch out of sequence 7

Această eroare va termina blocul, eventual cu o excepție netratată. Este deci important să se verifice succesul fiecarui FETCH înainte de alte referiri la cursor (fie prin alte FETCH sau comenzi SQL). Exemplu: OPEN cursor_1 ; LOOP FETCH cursor1 INTO a,b,c,d ; EXIT WHEN cursor1%NOTFOUND ; END LOOP;

1.6 Cursoarele si inregistrarile Am văzut deja că înregistrările pot fi definite sa se potrivească cu structura coloanelor unui tabele. Este de asemenea posibil să definim înregistrări bazate pe lista de coloane selectată explicit de cursor. Aceasta este convenabil pentru prelucrarea rîndurilor din setul activ, pentru ca să se poată extrage direct în înregistrare, și valorile rândului vor fi încarcate direct în câmpurile corespunzatoare ale inregistrării. Exemplu: DECLARE CURSOR c1 IS SELECT empno, sal, hiredate, rowid FROM emp WHERE deptno = 20 AND job = 'ANALYST' FOR UPDATE OF sal; emp_record c1%ROWTYPE; BEGIN OPEN c1; FETCH c1 INTO emp_record; IF emp_record.sal <2000 THEN ... De observat ca pseudo-coloana 'rowid' este validă ca articol selectabil și deci va avea un câmp corespunzator în înregistrarea 'emp_record'. Exemplul de mai sus arată deasemenea utilizarea FOR UPDATE într-o cerere cu cursor. Aceasta înseamna că rândurile întoarse de cerere sânt blocate exclusiv când instrucțiunea OPEN este executată. Deoarece blocările sânt eliberate la sfirșitul unei tranzacții, nu trebuie sa executați COMMIT între extragerile dintr-un cursor explicit dacă se folosește FOR UPDATE.

8

1.7 Folosirea clauzei WHERE CURRENT OF Când ne referim la rândul-curent dintr-un cursor explicit, comenzile SQL pot folosi WHERE CURSOR OF, cu numele cursorului. Aceasta permite actualizarea sau ștergerea în punctul în care ne aflăm, fără a fi necesară folosirea explicită a Rowid. Trebuie totuși să includeți FOR UPDATE în cererea cursorului, astfel încât rândurile să fie blocate la deschidere. Exemplu: FETCH c1 INTO emp_record ; IF emp_record.ename = ' KING' THEN DELETE FROM emp WHERE CURRENT OF c1; Sa luam un exemplu comlet. În blocul de mai jos se prelucreaza fiecare rând din tabela 'dep', mutând departamentul SALES în locația Dallas și celelalte departamente la New York. De asemenea se ține un contor al departamentelor plasate în fiecare locație. DECLARE CURSOR c1 IS SELECT dname, loc FROM dept FOR UPDATE OF loc ; dept_rec c1%ROWTYPE; sales_count NUMBER:=0 ; non_sales NUMBER := 0; BEGIN OPEN c1; LOOP FETCH c1 INTO dept_rec; EXIT WHEN c1%NOTFOUND; IF dept_rec.dname = 'SALES' AND dept_rec.loc != 'DALLAS' THEN UPDATE dept SET loc = 'DALLAS' WHERE CURRENT OF c1; sales_count := sales_count + 1; ELSIF dept_rec.dname != 'SALES' AND dept_rec.loc != 'NEW YORK' THEN UPDATE dept SET loc = 'NEW YORK' WHERE CURRENT OF c1; non_sales := non_sales +1 ; END IF; END LOOP; CLOSE c1; INSERT INTO counts (sales_set, non_sales_set ) VALUES (sales_count, non_sales); COMMIT; END; 9

1.8 Cursoare cu parametri Parametrii permit transmiterea unor valori unui cursor când acesta este deschis și utilizarea în cererile care se execută. Aceasta înseamnă că un cursor explicit poate fi deschis de mai multe ori într-un bloc, întorcând seturi de lucru diferite cu fiecare ocazie. Parametrii sânt definiți în instrucțiunea CURSOR astfel: CURSOR identif ( param-name data-type, param-name datetype, ... ) IS query-expresion; Tipurile parametrilor sânt aceleași cu ale variabilelor scalare, dar nu primesc dimensiune. Numele parametrilor sunt pentru referire în cadrul expresiei de cerere din cadrul cursorului și pot fi tratate ca variabile PL/SQL. Următorul exemplu arată numărul departamentului și tipul jobului care sunt transmise într-o clauza WHERE prin parametrii Param1 și Param2: CURSOR c1 ( Param1 NUMBER, Param2 CHAR ) IS SELECT ename, sal, hiredate FROM emp WHERE deptno = Param1 AND job = Param2; Când cursorul este ulterior deschis, valorile sunt transmise pentru fiecare din parametrii în mod pozițional. Valorile din PL/SQL sau variabile host pot fi utilizate și deasemenea ca litere. Exemplu: OPEN c1 (30, 'ANALYST'); OPEN c1 (pl_num, 'CLERK'); OPEN c1 (10, job_type); -- job_type este o variabila PL/SQL

1.9 Cicluri LOOP cursor PL/SQL oferă un tip special de ciclu FOR pentru a prelucra rândurile întoarse în cursorul explicit. Într-un ciclu FOR cursor, un cursor declarat este deschis, se efectueaza extrageri și este inchis automat când toate rândurile au fost prelucrate. Fiecare iterație a ciclului extrage un rând din setul activ într-o înregistrare, care este declarată implicit pentru utilizare în cadrul ciclului. Ciclul este terminat automat la sfirșitul iterației pentru ultimul rând extras. Ciclurile FOR cu cursor sunt structurate astfel:

10

DECLARE CURSOR cursor_name [ (parameters)] IS query-expresion; BEGIN FOR record-name IN cursor-name [ (parameters) ] LOOP --procesare valori din rindul curent. END LOOP; Înregistrarea numită în instrucțiunea FOR este declarată intern în ciclu și valabilitatea ei expiră când se termină ciclul. Fiecare iterație provoacă extragerea rândului următor din înregistrare. Deoarece cursorul este declarat explicit în bloc, atributele sale sunt disponibile în cadrul ciclului pentru testare, dacă este necesar. Exemplu: DECLARE CURSOR c1 IS SELECT n1, n2, n3 FROM data_table; result NUMBER; BEGIN FOR rec IN c1 LOOP result := rec.n2 / (rec.n1 + rec.n3); INSERT INTO temp_tab VALUES (result); END LOOP; COMMIT; END;

1.10 Cicluri FOR cursor cu parametri Dacă cursorul pe care îl procesați într-un ciclu FOR cursor a fost definit cu parametrii, valorile (parametrii actuali) sunt date în paranteză, după numele cursorului în instrucțiunea FOR. CURSOR c1 (Param1 DATE ) IS SELECT ename, job FROM emp WHERE hiredate < Param1 ; BEGIN FOR emp_record IN c1 ('01-JAN-92') LOOP -- vor fi activi angajatii de dupa ian92 END LOOP;

11

1.11 Subexpresii select în ciclurile FOR Am văzut că ciclurile FOR cu cursor sunt un mod convenabil de a prelucra rânduri dintrun cursor explicit declarat în program. Ciclurile FOR pot fi deasmenea utilizate pentru a prelucra cereri multi-rând, care sunt definite la inceputul ciclului. Structura este aratată mai jos: FOR rec-name IN (query-expresion) LOOP END LOOP; Expresia cererii este considerată ca o sub-expresie și este prelucrată într-un cursor care este intern ciclului FOR. Deoarece cursoarele nu sunt declarate cu nume, atributele cursoarelor nu sunt disponibile pentru testare. În afară că este mai simplu de scris, această metodă este și mult mai eficientă. Exemplu: FOr rec IN (SELECT ename FROM emp WHERE deptno = 10 ) LOOP IF rec.ename = 'JONES' THEN END LOOP;

12

2. Exemple și concluzii În capitolul ce urmează vor fi făcute concluziile și prezentate câteva exemple.

2.1 Câteva cuvinte despre eficiență Toți factorii care influențeaza performanța unui program SQL se aplică și la PL/SQL. Aceștia includ: - Indexarea coloanelor folosite în WHERE și în join; - Prefixarea coloanelor cu numele tabelei; - În joinurile indexate, referirea la tabela cea mai mică de la sfârșit. În plus, PL/SQL mai ofera funcționalitate care face instrucțiunile SQL nenecesare. - Nu accesați baza de date dacă nu este necesar; - Dacă toate datele de prelucrat sunt stocate în variabile, atunci folosiți construcții PL/SQL ca atribuire sau IF. Nu folosiți SELECT..FROM SYS.DUAL in mediul PL/SQL, deoarece produce deschiderea unui cursor și transmiterea unor cereri către RDBMS; - Efectuați calcule în SELECT, dacă este posibil; - Dacă aveți de efectuat prelucrări este mult mai eficient să le efectuați atunci când SELECT-ați date și evitați instrucțiuni ulterioare care ar fi necesare; - Cursoarele explicite vor permite evitarea unui FETCH ulterior; - Atunci când un singur rând este necesar, cursoarele implicite execută două extrageri; - Un cursor explicit va permite sa efectuați o singura extragere; - Evitați treceri repetate prin tabele. Prelucrarea procedurală permite un control puternic și flexibil al rândurilor bazei de date, dar trebuie să țineti cont că fiecare INSERT și UPDATE provoacă re-scanarea tabelei. Dacă prelucrati mai multe rânduri dintr-o tabela, încercați să o faceți într-un singur pas. Considerati situația următoare. Dorim să marim costul fiecarui articol din tabel 'items', pe rând, pâna când suma depașește 5000. În primul exemplu, o scanare a tabelei este utilizată de fiecare dată pentru a recalcula totalul când un articol este actualizat: WHILE total < 5000 LOOP FETCH item_cursor INTO old_cost; UPDATE items SET itemcost = itemcost *1.1 WHERE CURRENT OF item_cursor; SELECT SUM(itemcost) INTO total FROM items; END LOOP; O atribuire ar putea evita 'SELECT SUM' la fiecare iterație, calculând cât de mult totalul ar fi afectat de ultima actualizare: 13

WHILE total < 5000 LOOP FETCH item_cursor INTO old_cost; UPDATE items SET itemcost = itemcost *1.1 WHERE CURRENT OF item_cursor; tottal := total + old_cost *0.1; END LOOP;

2.2 Exemple comentate Primul exemplu folosește sintaxa Oracle pentru a regăsi un singur rând din cursor (primul rând): DECLARE TYPE ClientCursor IS REF CURSOR RETURN Clienti%ROWTYPE; DECLARE ClientInregistrare Clienti%ROWTYPE BEGIN OPEN ClientCursor; FETCH ClientCursor INTO ClientInregistrare; CLOSE ClientCursor; END; În acest exemplu, instrucțiunea FETCH este utilizată la regăsirea rândului curent (va porni, în mod automat, de la primul rând) într-o variabilă declarată, numită ClientInregistrare. Datele regăsite nu sunt prelucrate în nici un mod. În exemplul următor (care folosește din nou sintaxa Oracle), datele regăsite sunt parcurse ciclic, de la primul rând la ultimul: DECLARE TYPE ClientCursor IS REF CURSOR RETURN Clienti%ROWTYPE; DECLARE ClientInregistrare Clienti%ROWTYPE BEGIN OPEN ClientCursor; LOOP FETCH ClientCursor INTO ClientInregistrare; EXIT WHEN ClientCursor%NOTFOUND; ... END LOOP; CLOSE ClientCursor; END; Ca și în exemplul precedent, acest exemplu folosește instrucțiunea FETCH pentru a regăsi rândul curent într-o variabilă declarată, numită ClientInregistrare. Spre deosebire de exemplul precedent, aici instrucțiunea FETCH se găsește în interiorul unui ciclu (LOOP), astfel 14

încât se execută în mod repetat. Linia de program EXIT WHEN ClientCursor%NOTFOUND determină încheierea prelucrării (finalizarea ciclului) atunci când nu mai există alte rânduri de preluat. În acest exemplu nu se execută o prelucrare efectivă; într-un program autentic veți înlocui caracterele ... cu propriile dumneavoastra linii de program. Iată un alt exemplu, care de data aceasta folosește sintaxa Microsoft SQL Server: DECLARE @id_client CHAR(10), @nume_client CHAR(50), @adresa_client CHAR(50), @oras_client CHAR(50), @stat_client CHAR(5), @cod_postal_client CHAR(10), @tara_client CHAR(50), @contact_client CHAR(50), @email_client CHAR(255), OPEN ClientCursor FETCH NEXT FROM ClientCursor INTO @id_client, @nume_client, @adresa_client, @oras_client, @stat_client, @cod_postal_client, @tara_client, @contact_client, @email_client WHILE @@FETCH_STATUS = 0 BEGIN ... FETCH NEXT FROM ClientCursor INTO @id_client, @nume_client, @adresa_client, @oras_client, @stat_client, @cod_postal_client, @tara_client, @contact_client, @email_client END CLOSE ClientCursor În acest exemplu, sunt declarate variabile pentru fiecare dintre coloanele regăsite, iar instrucțiunile FETCH regăsesc un rând și salvează valorile în variabilele respective. Se folosește un ciclu WHILE pentru a parcurge rândurile, iar condiția WHILE @@FETCH_STATUS = 0 determină încheierea prelucrării (părăsirea ciclului) atunci când nu mai sunt rânduri de preluat. Din nou, în acest exemplu nu se execută prelucrări ale datelor; într-un program real veți înlocui caracterele ... cu propriile dumneavoastră linii de program.

2.3 Închiderea cursoarelor Așa cum s-a menționat și s-a văzut în exemplele precedente, cursoarele trebuie închise după utilizare. De asemenea, unele programe de tip SGBD (precum SQL Server) impun ca resursele folosite de cursor să fie în mod explicit eliberate. Iată sintaxa folosită în DB, Oracle, și PostgreSQL:

CLOSE ClientCursor Iată versiunea Microsoft SQL Server : CLOSE ClientCursor DEALLOCATE CURSOR ClientCursor Instrucțiunea CLOSE este folosită la închiderea cursoarelor; odată închis un cursor, acesta nu mai poate fi refolosit fără a fi deschis din nou. Cu toate acestea, un cursor nu trebuie să fie declarat din nou pentru a fi folosit; o instrucțiune OPEN este suficientă.

Concluzii: Efectuând lucrarea de curs dată, a fost făcută o prezentare a temei cursoarele. Astfel a fost selectată informația la temă și structurată, prezentându-se exemple în diferite SGBD precum Oracle sau Microsoft SQL Server. Un cursor reprezintă o zonă de memorie în care se reţine o instrucţiune SQL analizată şi informaţii utile procesării acesteia. Sistemul Oracle gestionează în mod automat cursoarele. În dezvoltarea unei aplicaţii, un cursor constituie o resursă disponibilă care poate fi utilizată pentru analizarea sintactică şi semantică explicită a instrucţiunilor SQL încapsulate în aplicaţie. Execuţia unui cursor plasează rezultatul cererii asociate într-o mulţime de linii (mulţime rezultat), care pot fi regăsite secvenţial sau nesecvenţial.

Bibliografie:

[1] Sams teach yourself sql in 10 minutes. (2007). Teora USA LLC. [2] Catedra de Calculatoare, F. d. (2012, aprilie 06). http://adisoftware.3x.ro. Preluat de pe adisoftware.

Related Documents


More Documents from ""