Wat is CURSOR in PL / SQL?
Een cursor is een verwijzing naar dit contextgebied. Oracle creëert een contextgebied voor het verwerken van een SQL-instructie die alle informatie over de instructie bevat.
Met PL / SQL kan de programmeur het contextgebied via de cursor besturen. Een cursor bevat de rijen die door de SQL-instructie worden geretourneerd. De set rijen die de cursor bevat, wordt actieve set genoemd. Deze cursors kunnen ook een naam krijgen, zodat ze kunnen worden verwezen vanaf een andere plaats in de code.
In deze tutorial leer je-
- Impliciete cursor
- Expliciete cursor
- Cursor attributen
- FOR Loop Cursor-instructie
De cursor is van twee soorten.
- Impliciete cursor
- Expliciete cursor
Impliciete cursor
Elke keer dat er DML-bewerkingen plaatsvinden in de database, wordt een impliciete cursor gemaakt die de betrokken rijen in die specifieke bewerking bevat. Deze cursors kunnen geen naam krijgen en daarom kunnen ze niet worden bestuurd of doorverwezen vanaf een andere plaats in de code. We kunnen alleen naar de meest recente cursor verwijzen via de cursorattributen.
Expliciete cursor
Programmeurs mogen een benoemde contextzone maken om hun DML-bewerkingen uit te voeren om er meer controle over te krijgen. De expliciete cursor moet worden gedefinieerd in de declaratiegedeelte van het PL / SQL-blok en wordt gemaakt voor de 'SELECT'-instructie die in de code moet worden gebruikt.
Hieronder staan de stappen die betrokken zijn bij het werken met expliciete cursors.
- De cursor aangeven
Het declareren van de cursor betekent simpelweg dat je een genoemd contextgebied maakt voor de 'SELECT'-instructie die is gedefinieerd in het declaratiegedeelte. De naam van dit contextgebied is hetzelfde als de cursornaam.
- Cursor openen
Door de cursor te openen, wordt de PL / SQL geïnstrueerd om het geheugen voor deze cursor toe te wijzen. Het maakt de cursor klaar om de records op te halen.
- Gegevens ophalen uit de cursor
In dit proces wordt de 'SELECT'-instructie uitgevoerd en worden de opgehaalde rijen opgeslagen in het toegewezen geheugen. Deze worden nu als actieve sets genoemd. Het ophalen van gegevens van de cursor is een activiteit op recordniveau, wat betekent dat we de gegevens record voor record kunnen openen.
Elke fetch-instructie haalt één actieve set op en bevat de informatie van dat specifieke record. Deze instructie is hetzelfde als de 'SELECT'-instructie die het record ophaalt en toewijst aan de variabele in de' INTO'-clausule, maar het genereert geen uitzonderingen.
- De cursor sluiten
Zodra al het record is opgehaald, moeten we de cursor sluiten zodat het geheugen dat aan dit contextgebied is toegewezen, wordt vrijgegeven.
Syntaxis:
DECLARECURSORIS
- In de bovenstaande syntaxis bevat het declaratiegedeelte de declaratie van de cursor en de cursorvariabele waarin de opgehaalde gegevens zullen worden toegewezen.
- De cursor wordt gemaakt voor de 'SELECT'-instructie die in de cursor-declaratie wordt gegeven.
- In het uitvoeringsgedeelte wordt de gedeclareerde cursor geopend, opgehaald en gesloten.
Cursor attributen
Zowel de impliciete cursor als de expliciete cursor hebben bepaalde attributen die toegankelijk zijn. Deze attributen geven meer informatie over de cursorbewerkingen. Hieronder staan de verschillende cursorattributen en hun gebruik.
Cursor Attribuut | Omschrijving |
% GEVONDEN | Het retourneert het Booleaanse resultaat 'TRUE' als de meest recente ophaalbewerking een record met succes heeft opgehaald, anders wordt FALSE geretourneerd. |
%NIET GEVONDEN | Dit werkt in tegenstelling tot% FOUND, het zal 'TRUE' retourneren als de meest recente ophaalbewerking geen record kon ophalen. |
%IS GEOPEND | Het retourneert het Booleaanse resultaat 'TRUE' als de gegeven cursor al is geopend, anders retourneert het 'FALSE' |
%AANTAL RIJEN | Het retourneert de numerieke waarde. Het geeft het werkelijke aantal records weer dat is beïnvloed door de DML-activiteit. |
Voorbeeld 1 : In dit voorbeeld gaan we zien hoe we de expliciete cursor kunnen declareren, openen, ophalen en sluiten.
We projecteren de hele naam van de werknemer uit de emp-tabel met behulp van een cursor. We zullen ook het cursorattribuut gebruiken om de lus in te stellen om alle records van de cursor op te halen.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;END IF;Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name);END LOOP;Dbms_output.put_line(‘Total rows fetched is‘||guru99_det%R0WCOUNT);CLOSE guru99_det;END:/
Uitvoer
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Code Verklaring:
- Coderegel 2 : Declaratie van de cursor guru99_det voor statement 'SELECT emp_name FROM emp'.
- Coderegel 3 : variabele lv_emp_name declareren.
- Coderegel 5 : de cursor openen guru99_det.
- Coderegel 6: Instellen van de Basic loop-instructie om alle records in de 'emp'-tabel op te halen.
- Coderegel 7: Haalt de guru99_det-gegevens op en wijst de waarde toe aan lv_emp_name.
- Coderegel 9: Gebruik het cursorattribuut '% NOTFOUND' om te zien of alle records in de cursor zijn opgehaald. Als het wordt opgehaald, zal het 'TRUE' retourneren en verlaat de besturing de lus, anders blijft de besturing de gegevens van de cursor ophalen en de gegevens afdrukken.
- Coderegel 11: EXIT-voorwaarde voor de lusinstructie.
- Coderegel 12: Druk de opgehaalde werknemersnaam af.
- Coderegel 14: Gebruik het cursorattribuut '% ROWCOUNT' om het totale aantal records te vinden dat is beïnvloed / opgehaald in de cursor.
- Coderegel 15: Na het verlaten van de lus wordt de cursor gesloten en wordt het toegewezen geheugen vrijgemaakt.
FOR Loop Cursor-instructie
De instructie "FOR LOOP" kan worden gebruikt om met cursors te werken. We kunnen de cursornaam geven in plaats van de bereiklimiet in de FOR-lusinstructie, zodat de lus werkt vanaf het eerste record van de cursor tot het laatste record van de cursor. De cursorvariabele, het openen van de cursor, het ophalen en sluiten van de cursor wordt impliciet gedaan door de FOR-lus.
Syntaxis:
DECLARECURSORIS
- In de bovenstaande syntaxis bevat het declaratiegedeelte de declaratie van de cursor.
- De cursor wordt gemaakt voor de 'SELECT'-instructie die in de cursor-declaratie wordt gegeven.
- In het uitvoeringsgedeelte wordt de gedeclareerde cursor ingesteld in de FOR-lus en de lusvariabele 'I' zal zich in dit geval als cursorvariabele gedragen.
Voorbeeld 1 : In dit voorbeeld zullen we alle werknemersnamen uit de emp-tabel projecteren met behulp van een cursor-FOR-lus.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Uitvoer
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Code Verklaring:
- Coderegel 2 : Declaratie van de cursor guru99_det voor statement 'SELECT emp_name FROM emp'.
- Coderegel 4 : Constructie van de 'FOR'-lus voor de cursor met de lusvariabele lv_emp_name.
- Coderegel 5: de naam van de werknemer afdrukken in elke iteratie van de lus.
- Coderegel 8: verlaat de lus
Opmerking: In Cursor-FOR-lus kunnen cursorattributen niet worden gebruikt omdat het openen, ophalen en sluiten van de cursor impliciet wordt gedaan door de FOR-lus.