logo

Ce este Cursorul în SQL?

Cursor este o memorie temporară sau o stație de lucru temporară. Este alocată de Bază de date Server la momentul efectuării operațiunilor DML (Data Manipulation Language) pe Tabel de către Utilizator. Cursorele sunt folosite pentru a stoca tabele de baze de date.

Există 2 tipuri de cursore: Cursore implicite și Cursore explicite. Acestea sunt explicate mai jos după cum urmează.

  1. Cursore implicite: Cursoarele implicite sunt cunoscute și ca Cursore implicite ale SQL SERVER. Aceste Cursore sunt alocate de SQL SERVER atunci când utilizatorul efectuează operațiuni DML.
  2. Cursore explicite: Cursoarele explicite sunt create de utilizatori ori de câte ori utilizatorul le solicită. Cursoarele explicite sunt folosite pentru preluarea datelor din tabel în mod rând cu rând.

Cum se creează un cursor explicit?

  1. Declarați obiectul cursorului

Sintaxă:



DECLARE cursor_name CURSOR FOR SELECT * FROM table_name

Interogare:

DECLARE s1 CURSOR FOR SELECT * FROM studDetails>

2. Deschideți Conexiune cursor

începe cu java

Sintaxă:

DESCHIDERE cursor_connection

Interogare:

OPEN s1>

Preluați date de pe cursor Există un total de 6 metode pentru a accesa datele de pe cursor. Acestea sunt după cum urmează:

  1. PRIMUL este folosit pentru a prelua doar primul rând din tabelul cursorului.
  2. ULTIMUL este folosit pentru a prelua numai ultimul rând din tabelul cursorului.
  3. URMĂTORUL este folosit pentru a prelua date în direcția înainte din tabelul cursorului.
  4. ÎNAINTE este folosit pentru a prelua date în direcția înapoi din tabelul cursorului.
  5. ABSOLUT n este folosit pentru a obține n exactthrând din tabelul cursorului.
  6. RELATIV n este folosit pentru a prelua datele într-un mod incremental, precum și într-un mod decremental.

Sintaxă:

FETCH NEXT/FIRST/LAST/PRIOR/ABSOLUTE n/RELATIVE n FROM cursor_name

Interogare:

FETCH FIRST FROM s1 FETCH LAST FROM s1 FETCH NEXT FROM s1 FETCH PRIOR FROM s1 FETCH ABSOLUTE 7 FROM s1 FETCH RELATIVE -2 FROM s1>
  • Închideți conexiunea cursorului

Sintaxă:

CLOSE cursor_name

Interogare:

CLOSE s1>
  • Dealocarea memoriei cursorului

Sintaxă:

DEALLOCATE nume_cursor

Interogare:

DEALLOCATE s1>

Cum se creează un cursor implicit?

Un cursor implicit este un cursor care este creat automat de PL/SQL atunci când executați o instrucțiune SQL. Nu trebuie să declarați sau să deschideți un cursor implicit în mod explicit. În schimb, PL/SQL gestionează cursorul pentru tine în culise.

Pentru a crea un cursor implicit în PL/SQL, trebuie pur și simplu să executați o instrucțiune SQL. De exemplu, pentru a prelua toate rândurile din tabelul EMP, puteți utiliza următorul cod:

Interogare:

BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;>

În PL/SQL, când performam INTRODUCE , ACTUALIZAȚI sau ȘTERGE operațiuni, un cursor implicit este creat automat. Acest cursor reține datele care trebuie inserate sau identifică rândurile care trebuie actualizate sau șterse. Vă puteți referi la acest cursor drept cursor SQL în codul dvs. Acest cursor SQL are mai multe atribute utile.

  1. %FOUND este adevărat dacă cea mai recentă operațiune SQL a afectat cel puțin un rând.
  2. %NOTFOUND este adevărat dacă nu a afectat niciun rând.
  3. %ROWCOUNT returnează numărul de rânduri afectate.
  4. %ISOPEN verifică dacă cursorul este deschis.

În plus față de aceste atribute, %BULK_ROWCOUNT și %BULK_EXCEPTIONS sunt specifice instrucțiunii FORALL, care este folosită pentru a efectua mai multe operațiuni DML simultan. %BULK_ROWCOUNT returnează numărul de rânduri afectate de fiecare operație DML, în timp ce %BULK_EXCEPTION returnează orice excepție care a apărut în timpul operațiunilor.

Interogare:

CREATE TABLE Emp( EmpID INT PRIMARY KEY, Name VARCHAR(50), Country VARCHAR(50), Age int(2), Salary int(10) ); -- Insert some sample data into the Customers table INSERT INTO Emp (EmpID, Name,Country, Age, Salary) VALUES (1, 'Shubham', 'India','23','30000'), (2, 'Aman ', 'Australia','21','45000'), (3, 'Naveen', 'Sri lanka','24','40000'), (4, 'Aditya', 'Austria','21','35000'), (5, 'Nishant', 'Spain','22','25000'); Select * from Emp;>

Ieșire:

img1

Acest program actualizează un tabel prin creșterea salariului fiecărui angajat cu 1500. După actualizare, atributul SQL%ROWCOUNT este folosit pentru a afla câte rânduri au fost afectate de operație.

Interogare:

DECLARE total_rows number; BEGIN UPDATE Emp SET Salary = Salary + 1500; total_rows := SQL%ROWCOUNT; dbms_output.put_line(total_rows || ' rows updated.'); END;>

Ieșire:

5 Emp selected PL/SQL procedure successfully completed.>

Excepții ale cursorului SQL

Ori de câte ori executăm o interogare SQL, există posibilitatea unei erori neașteptate. Cursorul parcurge fiecare set de rânduri pentru a reveni într-o interogare SQL.

Există câteva excepții foarte populare:

  1. Valoare duplicat: Acest tip de eroare apare atunci când cursorul încearcă să insereze o înregistrare sau un tuplu care există deja în baza de date. aceste tipuri de erori pot fi evitate prin gestionarea corectă a erorilor conf
  2. Stare nevalidă a cursorului: Ori de câte ori cursorul se află într-o stare nevalidă, acest tip de eroare va apărea ca o eroare.
  3. Timp de blocare: Acest lucru se întâmplă atunci când cursorul încearcă să obțină o blocare pe un rând sau un tabel, dar blocarea este deja deținută de o altă tranzacție.

Nevoia de cursor într-un server SQL

  1. Cursoarele ne permit să procesăm datele rând cu rând, ceea ce poate fi util atunci când trebuie să efectuăm calcule sau transformări complexe asupra datelor.
  2. Cursoarele ne permit să repetăm ​​un set de rezultate de mai multe ori, ceea ce poate fi util atunci când trebuie să efectuăm mai multe operații pe aceleași date.
  3. Cursoarele pot fi utile atunci când trebuie să unim mai multe tabele cu relații complexe, cum ar fi atunci când procesăm structuri de date ierarhice sau când executăm interogări recursive.
  4. Cursoarele ne permit să efectuăm operațiuni precum actualizarea, ștergerea sau inserarea înregistrărilor pe baza unor condiții sau criterii.
  5. Cursoarele sunt utile în special atunci când procesează date din mai multe tabele în care relațiile nu sunt simple.

Limitări ale cursorului SQL Server

Deoarece un cursor are anumite limitări, ar trebui să fie utilizat numai atunci când nu există altă opțiune. Aceste restricții includ:

  1. La procesarea datelor, acesta impune blocări asupra unui subset sau a întregului tabel.
  2. Tabelul de actualizare a cursorului înregistrează câte un rând, ceea ce îi încetinește performanța.
  3. În timp ce buclele sunt mai lente decât cursoarele, ele au mai multă supraîncărcare.
  4. Un alt factor care influențează viteza cursorului este cantitatea de rânduri și coloane introduse în cursor.

FAQ:

Î.1 Cum pot fi evitate cursorele?

Răspuns:

Funcția principală a cursorelor este navigarea în tabel rând cu rând. Următoarele sunt câteva metode simple pentru evitarea cursoarelor:

Î.2 Cum se utilizează While Loop în cursorul SQL?

Răspuns:

Utilizarea unei bucle while, care permite inserarea unui set de rezultate în tabelul temporar, este cel mai simplu mod de a evita necesitatea unui cursor.

Î.3 Ce sunt funcțiile definite de utilizator în SQL Cursor?

Răspuns:

Uneori, setul de rânduri rezultat este calculat folosind cursoare. Putem realiza acest lucru prin folosirea unei funcții definite de utilizator care respectă specificațiile.

Î.4 Utilizarea Joinurilor cu Cursorul SQL?

Răspuns:

În cazurile în care trebuie procesate înregistrări uriașe, join reduce numărul de linii de cod prin procesarea numai a acelor coloane care îndeplinesc condiția specificată.