Sunteți pe pagina 1din 6

Cursoare SQL SERVER 2008

Cursoarele SQL reprezintă o modalitate de parcurgere secvențială a unui set de înregistrări


returnat de o frază SQL de tip SELECT.

Sintaxa pentru declararea unui cursor:


DECLARE nume_cursor CURSOR
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
FOR instructiune_SQL_SELECT
[ FOR UPDATE [ OF nume_coloana [ ,...n ] ] ]

• SCROLL – permite operațiile FIRST, LAST, PRIOR, NEXT, RELATIVE,


ABSOLUTE pentru deplasarea în cadrul înregistrărilor cursorului

• FORWARD_ONLY – permite deplasarea numai în modul “înainte” în cadrul


înregistrărilor cursorului.

• STATIC – determina realizarea unei copii temporare a setului de înregistrări pe care se


lucrează. În cazul în care se fac modificări în tabelele folosite ca sursă de către cursor,
acestea nu se reflectă în cadrul setului de înregistrări virtual, asociat cursorului. Cursorul
nu este actualizabil.

• DYNAMIC – permite ca orice modificare efectuată în tabelele sursă ale cursorului să se


reflecte automat în setul de înregistrări asociat acestuia. În acest tip de cursor nu se poate
utiliza ABSOLUTE.

• FAST_FORWARD – se utilizează pentru a optimiza accesul la înregistrările


cursorului (numai “inainte”).

• KEYSET – specifică faptul că înregistrările din cursor sunt deschise într-o anumită
ordine.

• SCROLL_LOCKS – blochează înregistrările care se citesc (pentru ceilalţi


utilizatori), în aşa fel încât orice actualizare încercată pe înregistrările citite să se efectueze
cu succes.
• OPTIMISTIC – nu blochează înregistrările citite, însă în cazul în care alţi utilizatori
efectueză actualizări pe aceleaşi înregistrări cu cele din cursor, iar cel care utilizează
cursorul încearcă şi el modificări, se citeşte valoarea coloanei timestamp, iar în cazul în
care se detectează că s-au efectuat actualizări de către alţi utilizatori, atunci actualizarea
iniţiată în cursor va eşua.

• READ ONLY – nu sunt permise modificările/ștergerile în cadrul înregistrărilor


cursorului

• În fraza SQL de selecție nu sunt permise clauzele COMPUTE, COMPUTE BY și INTO


• UPDATE [OF nume_coloana [ ,...n ] ] ] – stabilește o coloană sau mai
multe coloane pe care se pot face actualizări în cadrul înregistrărilor cursorului

OPEN nume_cursor
Executa instructiunile T-SQL declarate in cursor si incarca in memorie setul de inregistrari
rezultat.

CLOSE nume_cursor

Inchide cursorul, orice blocaje induse de acesta inregistrarilor din tabelele folosite de cursor
fiind sterse.

DEALLOCATE nume_cursor
Elibereaza memoria ocupata de cursor.

FETCH

Accesează o înregistrare din cursor. Sintaxa:

FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
Nume_cursor
[ INTO @variable_name [ ,...n ] ]

ABSOLUTE { n | @nvar}
- dacă n este un număr pozitiv se returnează înregistrarea cu numărul n, calculată în
raport cu începutul cursorului.
- - dacă n este un număr negativ se returnează înregistrarea cu numărul n, calculată în
raport cu sfărşitul cursorului.

[ INTO @variable_name [ ,...n ] ]


Se specific un set de variabile in care se vor incarca valorile din coloanele randului accesat
din cursor. Variabilele se vor preciza in aceeasi ordine ca si campurile din cadrul cursorului.

Variabila @@FETCH_STATUS

Determina daca mai exista inregistrari de accesat in cursor. Valori posibile:


• 0 – inseamna ca instructiunea FETCH pentru accesarea unei inregistrari s-a executat cu
succes
• -1 – inseamna ca instructiunea FETCH pentru accesarea unei inregistrari a esuat
• -2 – inseamna ca instructiunea FETCH pentru accesarea unei inregistrari nu a gasit
inregistrarea

EXEMPLE
Baza de date folosita pentru exemple are urmatoareqa diagrama:
Exemplul 1.

Sa se defineasca o procedura stocata care sa foloseasca un cursor pentru urmatoarele operatii:


- parcurgerea unui set de inregistrari virtuale, secvential, inainte, care contin media
generala a pretului de facturare pentru fiecare produs;
- daca media pretului de facturare a unui produs din cursor este mai mare decat o
valoarea transmisa printr-un parametru procedurii stocate se va majora cu 10% pretul
de catalog al produsului respectiv (in tabelul Produse)

CREATE PROCEDURE TestCursor


@pParametru as money
AS

DECLARE cursorExemplu CURSOR STATIC SCROLL


FOR SELECT CodProdus, AVG(PretFacturare) as Medie
FROM ProduseFacturate
GROUP BY CodProdus

declare @pCodProdus as bigint, @pMedie as money


--aici am declarat doua variabile in care se vor incarca
--cele doua coloane ale cursorului

--urmatoarea fraza SQL este numai pentru control/test


--sa vedem ce se executa, adica sa vedem in fereastra Results
--mediile preturilor de facturare.
--Practic nu este necesara daca nu se doreste acest lucru
SELECT CodProdus, AVG(PretFacturare) as Medie
FROM ProduseFacturate
GROUP BY CodProdus

--urmatoarea fraza este tot pentru test sa vedem valorile initiale ale
preturilor de catalog
--si sa putem observa la sfarsit daca s-au produs modificari in date
SELECT * FROM Produs

OPEN cursorExemplu --se executa fraza SQL din cursor


FETCH NEXT FROM cursorExemplu --se pozitioneaza pe prima inregistrare din
cursor
INTO @pCodProdus, @pMedie --se incarca cele doua variabile cu valorile
din coloane

--in cazul in care exista cel putin o inregistrare


--se incearca parcurgerea intregului cursor atata timp
--cat o intructiune FETCH returneaza in variabila
--@@FETCH_STATUS valoarea zero
--Prima data instructiunea WHILE de mai jos verifica
--starea instructiunii FETCH executata anterior
WHILE @@FETCH_STATUS = 0
BEGIN
IF @pMedie>@pParametru
BEGIN
UPDATE Produs SET PretCatalog = PretCatalog * 1.1
WHERE CodProdus = @pCodProdus
END
FETCH NEXT FROM cursorExemplu --se pozitioneaza pe prima inregistrare
din cursor
INTO @pCodProdus, @pMedie
END

--urmatoarea fraza SQL este pentru test


--sa vedem daca s-au efectuat modificari
SELECT * FROM Produs

CLOSE cursorExemplu --se inchide cursorul


DEALLOCATE cursorExemplu --se elibereaza memoria

Apelul procedurii stocate:


EXEC TestCursor 15

In captura de mai jos se vede rezultatul executiei cursorului prin urmarirea inregistrarilor
returnate de cele trei fraze SQL de test, incluse in procedura stocata.

S-ar putea să vă placă și