Oracle PL/SQL-Cursor: Implizit, explizit, For-Schleife mit Beispiel
Was ist CURSOR in PL/SQL?
Ein Cursor ist ein Zeiger auf diesen Kontextbereich. Oracle erstellt einen Kontextbereich fรผr die Verarbeitung einer SQL-Anweisung, der alle Informationen zur Anweisung enthรคlt.
PL/SQL ermรถglicht es dem Programmierer, den Kontextbereich รผber den Cursor zu steuern. Ein Cursor enthรคlt die von der SQL-Anweisung zurรผckgegebenen Zeilen. Die Menge der Zeilen, die der Cursor hรคlt, wird als aktive Menge bezeichnet. Diese Cursor kรถnnen auch benannt werden, sodass sie von einer anderen Stelle im Code aus verwiesen werden kรถnnen.
Es gibt zwei Arten von Cursorn.
- Impliziter Cursor
- Explizite Cursor
Impliziter Cursor
Immer wenn DML-Operationen in der Datenbank stattfinden, wird ein impliziter Cursor erstellt, der die betroffenen Zeilen in dieser bestimmten Operation enthรคlt. Diese Cursor kรถnnen nicht benannt werden und kรถnnen daher nicht von einer anderen Stelle des Codes aus gesteuert oder referenziert werden. Wir kรถnnen nur รผber die Cursorattribute auf den aktuellsten Cursor verweisen.
Explizite Cursor
Programmierer kรถnnen benannte Kontextbereiche erstellen, um ihre DML-Operationen auszufรผhren und so mehr Kontrolle darรผber zu erhalten. Der explizite Cursor sollte im Deklarationsabschnitt des PL/SQL-Blockund wird fรผr die โSELECTโ-Anweisung erstellt, die im Code verwendet werden muss.
Nachfolgend sind die Schritte aufgefรผhrt, die bei der Arbeit mit expliziten Cursorn erforderlich sind.
- Deklarieren des Cursors Das Deklarieren des Cursors bedeutet einfach, einen benannten Kontextbereich fรผr die โSELECTโ-Anweisung zu erstellen, die im Deklarationsteil definiert ist. Der Name dieses Kontextbereichs ist derselbe wie der Cursorname.
- Cursor รถffnenDurch รffnen des Cursors werden die Anweisungen angezeigt PL / SQL um den Speicher fรผr diesen Cursor zu reservieren. Dadurch wird der Cursor zum Abrufen der Datensรคtze bereit gemacht.
- Daten vom Cursor abrufenIn diesem Prozess wird die SELECT-Anweisung ausgefรผhrt und die abgerufenen Zeilen werden im zugewiesenen Speicher gespeichert. Diese werden jetzt als aktive Mengen bezeichnet. Das Abrufen von Daten vom Cursor ist eine Aktivitรคt auf Datensatzebene, was bedeutet, dass wir datensatzweise auf die Daten zugreifen kรถnnen. Jede Abrufanweisung ruft einen aktiven Satz ab und enthรคlt die Informationen dieses bestimmten Datensatzes. Diese Anweisung ist mit der โSELECTโ-Anweisung identisch, die den Datensatz abruft und der Variablen in der โINTOโ-Klausel zuweist, lรถst jedoch keine Ausnahmen aus.
- Schlieรen des CursorsSobald der gesamte Datensatz abgerufen ist, mรผssen wir den Cursor schlieรen, damit der diesem Kontextbereich zugewiesene Speicher freigegeben wird.
Syntax
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 der obigen Syntax enthรคlt der Deklarationsteil die Deklaration des Cursors und die Cursorvariable, in der die abgerufenen Daten zugewiesen werden.
- Der Cursor wird fรผr die 'SELECT'-Anweisung erstellt, die in der Cursordeklaration angegeben ist.
- Im Ausfรผhrungsteil wird der deklarierte Cursor geรถffnet, abgerufen und geschlossen.
Cursorattribute
Sowohl der implizite als auch der explizite Cursor verfรผgen รผber bestimmte Attribute, auf die zugegriffen werden kann. Diese Attribute liefern weitere Informationen zu den Cursoroperationen. Nachfolgend finden Sie die verschiedenen Cursorattribute und ihre Verwendung.
| Cursor-Attribut | Beschreibung |
|---|---|
| % GEFUNDEN | Es gibt das Boolesche Ergebnis โTRUEโ zurรผck, wenn der letzte Abrufvorgang einen Datensatz erfolgreich abgerufen hat, andernfalls wird FALSE zurรผckgegeben. |
| %NICHT GEFUNDEN | Dies funktioniert entgegengesetzt zu %FOUND und gibt โTRUEโ zurรผck, wenn beim letzten Abrufvorgang kein Datensatz abgerufen werden konnte. |
| %IST OFFEN | Es gibt das boolesche Ergebnis โTRUEโ zurรผck, wenn der angegebene Cursor bereits geรถffnet ist, andernfalls wird โFALSEโ zurรผckgegeben. |
| %REIHENANZAHL | Es gibt den numerischen Wert zurรผck. Es gibt die tatsรคchliche Anzahl der Datensรคtze an, die von der DML-Aktivitรคt betroffen waren. |
Beispiel fรผr einen expliziten Cursor:
In diesem Beispiel werden wir sehen, wie der explizite Cursor deklariert, geรถffnet, abgerufen und geschlossen wird.
Mit einem Cursor projizieren wir den gesamten Namen des Mitarbeiters aus der Tabelle emp. Wir werden auch das Cursor-Attribut verwenden, um die Schleife so einzustellen, dass alle Datensรคtze vom Cursor abgerufen werden.
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: /
Ausgang
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Code Erklรคrung
- Codezeile 2: Deklarieren des Cursors guru99_det fรผr die Anweisung โSELECT emp_name FROM empโ.
- Codezeile 3: Variable lv_emp_name deklarieren.
- Codezeile 5: รffnen des Cursors guru99_det.
- Codezeile 6: Festlegen der Basic-Schleifenanweisung zum Abrufen aller Datensรคtze in der Tabelle โempโ.
- Codezeile 7: Ruft die guru99_det-Daten ab und weist den Wert lv_emp_name zu.
- Codezeile 9: Verwenden Sie das Cursor-Attribut โ%NOTFOUNDโ, um herauszufinden, ob der gesamte Datensatz im Cursor abgerufen wurde. Wenn es abgerufen wird, gibt es โTRUEโ zurรผck und die Steuerung verlรคsst die Schleife. Andernfalls holt die Steuerung weiterhin die Daten vom Cursor und druckt sie aus.
- Codezeile 11: EXIT-Bedingung fรผr die Schleifenanweisung.
- Codezeile 12: Drucken Sie den abgerufenen Mitarbeiternamen aus.
- Codezeile 14: Verwenden Sie das Cursor-Attribut โ%ROWCOUNTโ, um die Gesamtzahl der Datensรคtze zu ermitteln, die im Cursor betroffen/abgerufen wurden.
- Codezeile 15: Nach Verlassen der Schleife wird der Cursor geschlossen und der zugewiesene Speicher freigegeben.
FOR-Schleifen-Cursor-Anweisung
Die Anweisung โFOR LOOPโ kann zum Arbeiten mit Cursorn verwendet werden. Wir kรถnnen in der FOR-Schleifenanweisung den Cursornamen anstelle der Bereichsbegrenzung angeben, sodass die Schleife vom ersten Datensatz des Cursors bis zum letzten Datensatz des Cursors funktioniert. Die Cursorvariable, das รffnen des Cursors, das Abrufen und Schlieรen des Cursors werden implizit von der FOR-Schleife ausgefรผhrt.
Syntax
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
- In der obigen Syntax enthรคlt der Deklarationsteil die Deklaration des Cursors.
- Der Cursor wird fรผr die 'SELECT'-Anweisung erstellt, die in der Cursordeklaration angegeben ist.
- Im Ausfรผhrungsteil wird der deklarierte Cursor in der FOR-Schleife eingerichtet und die Schleifenvariable โIโ verhรคlt sich in diesem Fall als Cursorvariable.
Oracle Cursor fรผr Schleifenbeispiel:
In diesem Beispiel projizieren wir alle Mitarbeiternamen aus der emp-Tabelle mithilfe einer Cursor-FOR-Schleife.
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; /
Ausgang
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Code Erklรคrung
- Codezeile 2: Deklarieren des Cursors guru99_det fรผr die Anweisung โSELECT emp_name FROM empโ.
- Codezeile 4: Konstruieren der 'FOR'-Schleife fรผr den Cursor mit der Schleifenvariablen lv_emp_name.
- Codezeile 5: Drucken des Mitarbeiternamens in jeder Iteration der Schleife.
- Codezeile 8: Verlasse die Schleife
Hinweis: In der Cursor-FOR-Schleife kรถnnen Cursorattribute nicht verwendet werden, da das รffnen, Abrufen und Schlieรen des Cursors implizit erfolgt FOR-Schleife.

