Introducere în cursori în SQL

Cursorii sunt spații de lucru temporare create în memorie pentru a procesa unele comenzi SQL pe o grămadă de date. O definiție prea complicată? Hai să o înțelegem. Gândiți-vă la cursoare ca la fiecare buclă în SQL. Doriți să efectuați o sarcină pe un set de rânduri de date, utilizați cursorul. Să spunem că aveți un tabel de angajați care deține salariul pentru fiecare angajat al organizației. Vrei să crești salariul fiecărui angajat cu un anumit procent. Aici ai folosi un cursor. „Cum” a fost ilustrat mai târziu în articol.

Deci, cursoarele creează un spațiu de lucru temporar cu setul de rânduri selectat și un indicator care indică rândul curent. Acest set de rânduri, pe care cursorul va efectua operația dorită, se numește Set de date active. Indicatorul preia rândurile din setul de rezultate unul câte unul. Puteți efectua apoi orice operație SQL un rând la rând.

Cursoare implicite

Cursoarele implicite, după cum sugerează și numele, sunt generate de analizorul SQL pentru interogări DML. Interogările DML sunt interogări de manipulare a datelor. Aceste interogări manipulează sau modifică datele. Acestea nu interferează cu structura sau schema bazei de date. Interogări precum SELECT, INSERT, UPDATE și DELETE generează un cursor implicit. Cursorile implicite sunt ascunse utilizatorului final.

Cursoare explicite

Cursoarele explicite sunt cursoare generate de utilizator. Când un utilizator solicită analizorului SQL să creeze un cursor pentru un set activ, cursorul astfel creat se numește cursor explicit. Setul activ este definit printr-o interogare SELECT de către utilizator. Am acoperi cursoarele explicite în detaliu în acest articol.

Acțiuni ale cursorului - ciclul de viață al unui cursor

Ciclul de viață al unui cursor implică de obicei cinci etape:

1. Declare: Primul pas este declararea unui cursor. Acest pas indică sistemul să genereze un cursor cu setul de date dat. Setul de date este construit folosind o instrucțiune SQL. În această etapă, setul activ este creat, dar spațiul de lucru temporar al cursorului nu este încă deschis în memorie.

2. Deschideți: Apoi, sistemul este instruit să deschidă cursorul. În această etapă, spațiul de lucru temporar este încărcat în memorie cu setul activ și este generat un indicator care indică primul rând din setul activ.

3. Fetch: Acesta este pasul recurent în întregul proces. Rândul curent indicat de indicatorul este obținut și sarcina dorită este efectuată pe datele rândului. Indicatorul se mută în rândul următor din cursor.

4. Închidere: După manipularea datelor, cursorul trebuie închis.

5. Deallocare: Acesta este ultimul pas pentru a șterge cursorul și a elibera memoria, procesorul și alte resurse de sistem alocate cursorului.

Cursoare explicite - în acțiune!

Bine, acum avem o înțelegere de bază despre ce sunt cursoarele și cum funcționează. Este timpul să ne murdărim mâinile și să creăm noi înșine un cursor explicit.

Terminologia cursorilor în SQL

Să înțelegem terminologiile utilizate în această sintaxă.

Scopul cursorului

  • Scopul cursorului poate fi GLOBAL sau LOCAL . Un cursor global este disponibil pe întreaga conexiune. Un cursor local este limitat numai la procedurile, funcțiile sau interogarea stocată care conține cursorul.
  • Aceasta este caracteristica specifică MS SQL Server. MySQL acceptă numai cursoare localizate.

Mișcarea cursorului

  • MS SQL Server oferă, de asemenea, opțiunea de a seta mișcarea cursorului. Poate fi fie modul Forward_Only convențional care mută indicatorul de la primul rând până la ultima linie cu linie. Sau poate fi defilat la primul, ultimul, precedentul sau următorul rând.
  • Cursoarele în MySQL nu pot fi defilate.

Tip cursor

  • Un cursor poate fi static, deoarece în acesta poate memora în cache setul activ până la deslocare și poate jongla înainte și înapoi prin acest set activ în cache. Un cursor poate fi avansat rapid doar în modul static.
  • Poate fi, de asemenea, dinamic pentru a permite adăugarea sau ștergerea rândurilor din setul activ în timp ce cursorul este deschis. Aceste modificări nu sunt vizibile pentru alți utilizatori ai cursorului în modul tastatură. Cursoarele în MySQL sunt numai rapide_forward.

Blocarea cursorului

  • Blocarea cursorului este utilă într-un mediu multi-utilizator. Acestea blochează rândul astfel încât niciun utilizator să nu opereze simultan pe aceleași date. Aceasta asigură integritatea datelor.
  • O blocare cu citire numai afirmă că rândul nu poate fi actualizat.
  • Scroll-lock-urile blochează rândul pe măsură ce sunt aduse în cursor, asigurându-se că sarcina reușește și datele actualizate sunt disponibile în afara cursorului. Încercări optimiste de a actualiza rândul fără blocare. Astfel, dacă rândul a fost actualizat în afara cursorului, sarcina nu va reuși.
  • MySQL acceptă numai blocări de citire. Aceasta înseamnă că MySQL nu va actualiza tabelul efectiv, ci va copia datele pentru a efectua comenzi de actualizare.

Astfel, vedem că aceste opțiuni sunt disponibile numai în MS SQL Server. Acest lucru face ca sintaxa pentru cursoarele MySQL să fie și mai simplă.

Exemplu

Să actualizăm acum salariul angajaților din tabelul angajaților noștri.

Am folosi datele de mai jos din aceste cursoare în exemplul SQL.

Codul nostru de cursor ar fi următorul:

DECLARE @sal float
DECLARE @newsal float
DECLARE Emp_Cur CURSOR FOR SELECT Salary, Updated_Salary FROM Employees
OPEN Emp_Cur
FETCH NEXT FROM Emp_Cur INTO @sal, @newsal
WHILE @@FETCH_STATUS = 0
BEGIN
SET @newsal = @sal*1.25
UPDATE Employees SET Updated_Salary = @newsal WHERE CURRENT OF Emp_Cur
FETCH NEXT FROM Emp_Cur INTO @sal, @newsal
END
CLOSE Emp_Cur
DEALLOCATE Emp_Cur

Și ieșirea după executarea comenzii cursorului de mai sus ar fi:

Concluzie - cursoare în SQL

Astfel, am văzut care sunt cursoarele, cum să le folosim și unde să le evităm. Cursorii se dovedesc a fi o utilitate utilă pentru dezvoltatori, dar cu costul performanței. Deci, aveți grijă când optați pentru cursoare.

Articole recomandate

Acesta este un ghid pentru cursorii în SQL. Aici discutăm tipurile, ciclul de viață și terminologia cursorului în SQL cu exemple. De asemenea, puteți parcurge și alte articole sugerate -

  1. Tipuri de uniri în SQL
  2. SQL Alter Command
  3. Vizualizări SQL
  4. Instrumente de management SQL
  5. Tipuri de cursoare în PL / SQL
  6. Top 6 tipuri de uniri în MySQL cu exemple