Cursor is een tijdelijk geheugen of tijdelijk werkstation. Het wordt toegewezen door Database Server op het moment dat de gebruiker DML-bewerkingen (Data Manipulation Language) op de tafel uitvoert. Cursors worden gebruikt om databasetabellen op te slaan.
Er zijn twee soorten cursors: impliciete cursors en expliciete cursors. Deze worden hieronder toegelicht.
- Impliciete cursors: Impliciete cursors worden ook wel standaardcursors van SQL SERVER genoemd. Deze cursors worden toegewezen door SQL SERVER wanneer de gebruiker DML-bewerkingen uitvoert.
- Expliciete cursors: Expliciete cursors worden door gebruikers gemaakt wanneer de gebruiker ze nodig heeft. Expliciete cursors worden gebruikt voor het rij-voor-rij ophalen van gegevens uit de tabel.
Hoe maak ik een expliciete cursor?
- Cursorobject declareren
Syntaxis:
DECLARE cursornaam CURSOR FOR SELECT * FROM tabelnaam
Vraag:
DECLARE s1 CURSOR FOR SELECT * FROM studDetails>
2. Open Cursorverbinding
nadelen van internetbankieren
Syntaxis:
OPEN cursor_verbinding
Vraag:
OPEN s1>
Haal gegevens op van de cursor Er zijn in totaal 6 methoden om toegang te krijgen tot gegevens van de cursor. Ze zijn als volgt:
- EERST wordt gebruikt om alleen de eerste rij uit de cursortabel op te halen.
- LAATST wordt gebruikt om alleen de laatste rij uit de cursortabel op te halen.
- VOLGENDE wordt gebruikt om gegevens in voorwaartse richting op te halen uit de cursortabel.
- VOORAFGAAND wordt gebruikt om gegevens in achterwaartse richting op te halen uit de cursortabel.
- ABSOLUTE n wordt gebruikt om de exacte n op te halenerij uit de cursortabel.
- RELATIEVE zn wordt gebruikt om de gegevens zowel incrementeel als decrementeel op te halen.
Syntaxis:
FETCH NEXT/FIRST/LAST/PRIOR/ABSOLUTE n/RELATIVE n FROM cursornaam
Vraag:
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>
- Sluit de cursorverbinding
Syntaxis:
SLUIT cursornaam
Vraag:
CLOSE s1>
- Maak de toewijzing van het cursorgeheugen ongedaan
Syntaxis:
DEALLOCATE cursornaam
Vraag:
DEALLOCATE s1>
Hoe maak je een impliciete cursor?
Een impliciete cursor is een cursor die automatisch door PL/SQL wordt aangemaakt wanneer u een SQL-instructie uitvoert. U hoeft een impliciete cursor niet expliciet te declareren of te openen. In plaats daarvan beheert PL/SQL de cursor achter de schermen voor u.
Om een impliciete cursor in PL/SQL te maken, hoeft u alleen maar een SQL-instructie uit te voeren. Om bijvoorbeeld alle rijen uit de EMP-tabel op te halen, kunt u de volgende code gebruiken:
Vraag:
BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;> In PL/SQL, wanneer we optreden INVOEGEN , UPDATE of VERWIJDEREN bewerkingen wordt er automatisch een impliciete cursor gemaakt. Deze cursor bevat de gegevens die moeten worden ingevoegd of identificeert de rijen die moeten worden bijgewerkt of verwijderd. U kunt naar deze cursor verwijzen als de SQL-cursor in uw code. Deze SQL-cursor heeft verschillende nuttige attributen.
- %FOUND is waar als de meest recente SQL-bewerking ten minste één rij heeft beïnvloed.
- %NOTFOUND is waar als het geen enkele rij beïnvloedde.
- %ROWCOUNT retourneert het aantal betrokken rijen.
- %ISOPEN controleert of de cursor open is.
Naast deze kenmerken zijn %BULK_ROWCOUNT en %BULK_EXCEPTIONS specifiek voor de FORALL-instructie, die wordt gebruikt om meerdere DML-bewerkingen tegelijk uit te voeren. %BULK_ROWCOUNT retourneert het aantal rijen dat wordt beïnvloed door elke DML-bewerking, terwijl %BULK_EXCEPTION elke uitzondering retourneert die is opgetreden tijdens de bewerkingen.
Vraag:
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;>
Uitgang:
Dit programma werkt een tabel bij door het salaris van elke werknemer met 1500 te verhogen. Na de update wordt het kenmerk SQL%ROWCOUNT gebruikt om uit te vinden op hoeveel rijen de bewerking van toepassing is.
Vraag:
DECLARE total_rows number; BEGIN UPDATE Emp SET Salary = Salary + 1500; total_rows := SQL%ROWCOUNT; dbms_output.put_line(total_rows || ' rows updated.'); END;>
Uitgang:
5 Emp selected PL/SQL procedure successfully completed.>
Uitzonderingen voor SQL-cursor
Telkens wanneer we een SQL-query uitvoeren, bestaat de mogelijkheid dat er een onverwachte fout optreedt. Cursor doorloopt elke reeks rijen om terug te keren in een SQL-query.
Er zijn enkele zeer populaire uitzonderingen:
- Dubbele waarde: Dit type fout treedt op wanneer de cursor een record of tuple probeert in te voegen dat al in de database bestaat. dit soort fouten kunnen worden vermeden door de juiste foutconf
- Ongeldige cursorstatus: Wanneer de cursor een ongeldige status heeft, wordt dit type fout weergegeven als een fout.
- Time-out vergrendelen: Dit gebeurt wanneer de cursor een vergrendeling op een rij of tabel probeert te verkrijgen, maar de vergrendeling al in handen is van een andere transactie.
Cursor nodig in een SQL-server
- Met cursors kunnen we gegevens rij voor rij verwerken, wat handig kan zijn als we complexe berekeningen of transformaties op de gegevens moeten uitvoeren.
- Met cursors kunnen we een resultatenset meerdere keren herhalen, wat handig kan zijn als we meerdere bewerkingen op dezelfde gegevens moeten uitvoeren.
- Cursors kunnen handig zijn wanneer we meerdere tabellen met complexe relaties moeten samenvoegen, zoals bij het verwerken van hiërarchische gegevensstructuren of bij het uitvoeren van recursieve zoekopdrachten.
- Met cursors kunnen we bewerkingen uitvoeren zoals het bijwerken, verwijderen of invoegen van records op basis van een bepaalde voorwaarde of criteria.
- Cursors zijn vooral handig bij het verwerken van gegevens uit meerdere tabellen waarbij de relaties niet eenduidig zijn.
Beperkingen van de SQL Server-cursor
Omdat een cursor enkele beperkingen heeft, mag deze alleen worden gebruikt als er geen andere keuze is. Deze beperkingen omvatten:
- Bij het verwerken van gegevens worden er vergrendelingen opgelegd aan een subset of de hele tabel.
- De cursor werkt tabelrecords één rij tegelijk bij, wat de prestaties vertraagt.
- Hoewel loops langzamer zijn dan cursors, hebben ze wel meer overhead.
- Een andere factor die de cursorsnelheid beïnvloedt, is het aantal rijen en kolommen dat in de cursor wordt geplaatst.
FAQ:
Vraag.1 Hoe kunnen cursors worden vermeden?
Antwoord:
De primaire functie van cursors is rij-voor-rij tabelnavigatie. Hier volgen enkele eenvoudige methoden om cursors te vermijden:
Vraag 2 Hoe gebruik ik While Loop in SQL Cursor?
Antwoord:
Het gebruik van een while-lus, waarmee een resultaatset in de tijdelijke tabel kan worden ingevoegd, is de eenvoudigste manier om de noodzaak van een cursor te vermijden.
Vraag 3 Wat zijn door de gebruiker gedefinieerde functies in SQL Cursor?
Antwoord:
Soms wordt de resulterende rijset berekend met behulp van cursors. Dit kunnen we bereiken door een door de gebruiker gedefinieerde functie in te zetten die voldoet aan de specificaties.
V.4 Gebruik van joins met SQL Cursor?
Antwoord:
In gevallen waarin grote records moeten worden verwerkt, vermindert join het aantal regels code door alleen die kolommen te verwerken die aan de opgegeven voorwaarde voldoen.