Cursoare SQL Server 2008

Published on May 2016 | Categories: Types, School Work, Essays & Theses | Downloads: 16 | Comments: 0 | Views: 501
of 6
Download PDF   Embed   Report

BAZE DE DATE AVANSATE - SQL SERVER 2008

Comments

Content

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 [email protected]@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 DEALLOCATE cursorExemplu --se inchide cursorul --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.

Sponsor Documents

Or use your account on DocShare.tips

Hide

Forgot your password?

Or register your new account on DocShare.tips

Hide

Lost your password? Please enter your email address. You will receive a link to create a new password.

Back to log-in

Close