Oracle PL/SQL-cursor: impliciet, expliciet, for-lus met voorbeeld
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 dat 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 reeks rijen die de cursor vasthoudt, wordt een actieve set genoemd. Deze cursors kunnen ook een naam krijgen, zodat ze vanuit een andere plaats in de code kunnen worden verwezen.
Er zijn twee soorten cursors.
- Impliciete cursor
- Expliciete cursor
Impliciete cursor
Wanneer er DML-bewerkingen in de database plaatsvinden, wordt er een impliciete cursor gemaakt die de rijen bevat die in die specifieke bewerking zijn beïnvloed. Deze cursors kunnen niet worden benoemd en kunnen daarom niet worden bestuurd of verwezen vanaf een andere plaats in de code. We kunnen alleen verwijzen naar de meest recente cursor via de cursorattributen.
Expliciete cursor
Programmeurs mogen een benoemd contextgebied maken om hun DML-bewerkingen uit te voeren en er meer controle over te krijgen. De expliciete cursor moet worden gedefinieerd in de declaratiesectie van de PL/SQL-blok, en het is 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 declareren Het declareren van de cursor betekent eenvoudigweg het creëren van één benoemd contextgebied voor de 'SELECT'-instructie die is gedefinieerd in het declaratiegedeelte. De naam van dit contextgebied is dezelfde als de cursornaam.
- OpeningscursorAls u de cursor opent, wordt de opdracht gegeven PL / SQL om het geheugen voor deze cursor toe te wijzen. Het zorgt ervoor dat de cursor klaar is om de records op te halen.
- Gegevens ophalen van de cursorIn dit proces wordt de 'SELECT'-instructie uitgevoerd en worden de opgehaalde rijen opgeslagen in het toegewezen geheugen. Deze worden nu actieve sets genoemd. Het ophalen van gegevens van de cursor is een activiteit op recordniveau, wat betekent dat we per record toegang hebben tot de gegevens. 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 er worden geen uitzonderingen gegenereerd.
- De cursor sluitenZodra alle records nu zijn opgehaald, moeten we de cursor sluiten, zodat het geheugen dat aan dit contextgebied is toegewezen, wordt vrijgegeven.
Syntaxis
DECLARE CURSOR <cursor_name> IS <SELECT statement^> <cursor_variable declaration> BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
- 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 wordt gegeven in de cursordeclaratie.
- In het uitvoeringsgedeelte wordt de aangegeven cursor geopend, opgehaald en gesloten.
Cursorkenmerken
Zowel de impliciete cursor als de expliciete cursor heeft bepaalde attributen die toegankelijk zijn. Deze attributen geven meer informatie over de cursorbewerkingen. Hieronder staan de verschillende cursorattributen en hun gebruik.
Cursorkenmerk | Beschrijving |
---|---|
% GEVONDEN | Het retourneert de Booleaanse uitkomst 'TRUE' als de meest recente ophaalbewerking een record succesvol heeft opgehaald. Anders wordt FALSE geretourneerd. |
%NIET GEVONDEN | Dit werkt het tegenovergestelde van %FOUND: het retourneert 'TRUE' als de meest recente ophaalbewerking geen enkel record kon ophalen. |
%IS GEOPEND | Het retourneert het Booleaanse resultaat 'TRUE' als de gegeven cursor al geopend is, anders retourneert het 'FALSE' |
%AANTAL RIJEN | Het retourneert de numerieke waarde. Het geeft het werkelijke aantal records weer dat werd beïnvloed door de DML-activiteit. |
Expliciet cursorvoorbeeld:
In dit voorbeeld gaan we zien hoe u de expliciete cursor kunt declareren, openen, ophalen en sluiten.
We zullen de volledige naam van de werknemer uit de emp-tabel projecteren met behulp van een cursor. We zullen ook het cursorattribuut gebruiken om de lus zo in te stellen dat alle records van de cursor worden opgehaald.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; 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: /
uitgang
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Code Uitleg
- Coderegel 2: De cursor guru99_det declareren voor instructie 'SELECT emp_name FROM emp'.
- Coderegel 3: Variabele lv_emp_name declareren.
- Coderegel 5: De cursor openen guru99_det.
- Coderegel 6: De Basic loop-instructie instellen 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 bepalen of alle records in de cursor zijn opgehaald. Indien opgehaald, zal het 'TRUE' retourneren en zal de besturing de lus verlaten, anders zal de besturing doorgaan met het ophalen van de gegevens van de cursor en het afdrukken van de gegevens.
- 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 door de cursor is beïnvloed/opgehaald.
- Coderegel 15: Na het verlaten van de lus wordt de cursor gesloten en wordt het toegewezen geheugen vrijgegeven.
FOR Loop Cursor-instructie
De “FOR LOOP”-instructie kan worden gebruikt voor het werken met cursors. We kunnen de cursornaam opgeven 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 worden impliciet gedaan door de FOR-lus.
Syntaxis
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
- In de bovenstaande syntaxis bevat het declaratiegedeelte de declaratie van de cursor.
- De cursor wordt gemaakt voor de 'SELECT'-instructie die wordt gegeven in de cursordeclaratie.
- In het uitvoeringsgedeelte wordt de aangegeven cursor ingesteld in de FOR-lus en de lusvariabele 'I' zal zich in dit geval gedragen als cursorvariabele.
Oracle Cursor voor lusvoorbeeld:
In dit voorbeeld projecteren we de volledige werknemersnaam uit de emp-tabel met behulp van een cursor-FOR-lus.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name); END LOOP; END; /
uitgang
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Code Uitleg
- Coderegel 2: De cursor guru99_det declareren voor instructie 'SELECT emp_name FROM emp'.
- Coderegel 4: De 'FOR'-lus voor de cursor construeren met de lusvariabele lv_emp_name.
- Coderegel 5: Het afdrukken van de naam van de werknemer in elke iteratie van de lus.
- Coderegel 8: Verlaat de lus
Opmerking: In de Cursor-FOR-lus kunnen cursorattributen niet worden gebruikt, omdat het openen, ophalen en sluiten van de cursor impliciet gebeurt door For loop.