Oracle PL/SQL-Cursor: Implizit, explizit, For-Schleife mit Beispiel
โก Intelligente Zusammenfassung
Cursor in Oracle PL/SQL-Zeiger verweisen auf den Kontextbereich, der die von einer SQL-Anweisung zurรผckgegebenen Zeilen enthรคlt. Es gibt zwei Arten: implizite Cursor, die automatisch fรผr DML-Operationen erstellt werden, und explizite Cursor, die vom Programmierer deklariert und gesteuert werden.

Was ist CURSOR in PL/SQL?
Ein Cursor ist ein Zeiger auf den Kontextbereich. Oracle erstellt einen Kontextbereich fรผr die Verarbeitung eines SQL Die Aussage und dieser Bereich enthรคlt alle Informationen รผber die Aussage.
PL / SQL Der Programmierer kann den Kontextbereich mithilfe des Cursors steuern. Ein Cursor enthรคlt die von der SQL-Anweisung zurรผckgegebenen Zeilen; die Menge der vom Cursor enthaltenen Zeilen wird als aktive Menge bezeichnet. Diese Cursor kรถnnen auch benannt werden, sodass sie von einer anderen Stelle im Code referenziert werden kรถnnen.
Es gibt zwei Arten von Cursorn:
- Impliziter Cursor
- Explizite Cursor
Impliziter Cursor
Wann immer DML-Operation Wird in der Datenbank eine Operation ausgefรผhrt, wird implizit ein Cursor erstellt, der die von dieser Operation betroffenen Zeilen enthรคlt. Diese Cursor kรถnnen nicht benannt und daher nicht von anderer Stelle im Code gesteuert oder referenziert werden. Wir kรถnnen nur รผber die Cursorattribute auf den zuletzt verwendeten Cursor zugreifen.
Explizite Cursor
Programmierer kรถnnen einen benannten Kontextbereich erstellen, um ihre DML-Operationen auszufรผhren und so mehr Kontrolle darรผber zu erhalten. Der explizite Cursor sollte im Deklarationsabschnitt der Datei definiert werden. PL/SQL-BlockEs wird fรผr die SELECT-Anweisung erstellt, die im Code verwendet werden muss.
Nachfolgend sind die Schritte aufgefรผhrt, die beim Arbeiten mit expliziten Cursorn erforderlich sind:
- Deklaration des Cursors: Die Deklaration des Cursors bedeutet einfach, einen benannten Kontextbereich fรผr die im Deklarationsteil definierte SELECT-Anweisung zu erstellen. Der Name dieses Kontextbereichs entspricht dem Cursornamen.
- รffnen des Cursors: Durch das รffnen des Cursors wird PL/SQL angewiesen, den Speicher fรผr diesen Cursor zu reservieren. Dadurch wird der Cursor bereit, die Datensรคtze abzurufen.
- Daten vom Cursor abrufen: Dabei wird die SELECT-Anweisung ausgefรผhrt und die abgerufenen Zeilen im reservierten Speicher abgelegt. Diese werden nun als aktive Mengen bezeichnet. Das Abrufen von Daten รผber den Cursor erfolgt auf Datensatzebene, d. h. wir kรถnnen datensatzweise auf die Daten zugreifen. Jede Fetch-Anweisung ruft eine aktive Menge ab und enthรคlt die Informationen des jeweiligen Datensatzes. Diese Anweisung entspricht einer SELECT-Anweisung, die den Datensatz abruft und ihn der Variablen in der INTO-Klausel zuweist, lรถst aber keine Ausnahme aus. Ausnahmen.
- Schlieรen des Cursors: Sobald alle Datensรคtze abgerufen wurden, muss der Cursor geschlossen werden, damit der fรผr diesen Kontextbereich reservierte 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 der Cursor-Variablen, der die abgerufenen Daten zugewiesen werden. Der Cursor wird fรผr die in der Cursor-Deklaration angegebene SELECT-Anweisung erstellt. Im Ausfรผhrungsteil wird der deklarierte Cursor geรถffnet, die Daten werden abgerufen und der Cursor wird geschlossen.
Cursorattribute
Sowohl der implizite als auch der explizite Cursor verfรผgen รผber bestimmte Attribute, auf die zugegriffen werden kann. Diese Attribute liefern detailliertere Informationen zu den Cursoroperationen. Im Folgenden werden die verschiedenen Cursorattribute und ihre Verwendung erlรคutert.
| Cursor-Attribut | Beschreibung |
|---|---|
| % GEFUNDEN | Gibt den booleschen Wert TRUE zurรผck, wenn der letzte Abrufvorgang einen Datensatz erfolgreich abgerufen hat; andernfalls wird FALSE zurรผckgegeben. |
| %NICHT GEFUNDEN | Funktioniert genau entgegengesetzt zu %FOUND. Es gibt TRUE zurรผck, wenn der letzte Abrufvorgang keinen Datensatz finden konnte. |
| %IST OFFEN | Gibt den booleschen Wert TRUE zurรผck, wenn der angegebene Cursor bereits geรถffnet ist; andernfalls wird FALSE zurรผckgegeben. |
| %REIHENANZAHL | Gibt einen numerischen Wert zurรผck, der die tatsรคchliche Anzahl der von der Operation betroffenen oder abgerufenen Datensรคtze angibt. |
Beispiel fรผr einen expliziten Cursor: In diesem Beispiel zeigen wir, wie man einen expliziten Cursor deklariert, รถffnet, abruft und schlieรt. Wir projizieren alle Mitarbeiternamen aus der Tabelle โempโ mithilfe eines Cursors. Auรerdem verwenden wir ein Cursor-Attribut, um die Schleife so einzustellen, dass alle Datensรคtze aus dem Cursor abgerufen werden.
Der folgende Screenshot zeigt dieses explizite Cursor-Beispiel und seine Ausgabe. Oracle.
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%ROWCOUNT); CLOSE guru99_det; END; /
Ausgang
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Code Erlรคuterung
- Code Zeile 2: Deklaration des Cursors guru99_det fรผr die Anweisung 'SELECT emp_name FROM emp'.
- Code Zeile 3: Deklaration der Variable lv_emp_name mit der %Typ verankert an emp.emp_name.
- Code Zeile 5: รffne den Cursor guru99_det.
- Code Zeile 6: Die grundlegende Schleifenanweisung wird so eingestellt, dass alle Datensรคtze in der Tabelle โempโ abgerufen werden.
- Code Zeile 7: Ruft die guru99_det-Daten ab und weist den Wert lv_emp_name zu.
- Code Zeile 8: Mithilfe des Cursor-Attributs %NOTFOUND wird geprรผft, ob alle Datensรคtze im Cursor abgerufen wurden. Falls ja, wird TRUE zurรผckgegeben und die Schleife beendet; andernfalls werden die Daten weiterhin aus dem Cursor abgerufen und ausgegeben.
- Code Zeile 10: EXIT-Bedingung fรผr die Schleifenanweisung.
- Code Zeile 12: Drucken Sie den abgerufenen Mitarbeiternamen aus.
- Code Zeile 14: Mithilfe des Cursorattributs %ROWCOUNT lรคsst sich die Gesamtzahl der vom Cursor abgerufenen Datensรคtze ermitteln.
- Code Zeile 15: Nach Verlassen der Schleife wird der Cursor geschlossen und der reservierte Speicher freigegeben.
FOR-Schleifen-Cursor-Anweisung
Ein Cursor FOR-Schleife Die FOR-Schleife kann zur Arbeit mit Cursorn verwendet werden. Anstelle eines Bereichslimits kann der Cursorname angegeben werden, sodass die Schleife vom ersten bis zum letzten Datensatz des Cursors ausgefรผhrt wird. Die Cursorvariable, das รffnen, Abrufen und Schlieรen des Cursors erfolgen implizit durch die FOR-Schleife.
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 in der Cursor-Deklaration angegebene SELECT-Anweisung erstellt. Im Ausfรผhrungsteil wird der deklarierte Cursor in der FOR-Schleife eingerichtet, und die Schleifenvariable 'I' fungiert in diesem Fall als Cursorvariable.
Oracle Cursor-for-Schleife Beispiel: In diesem Beispiel werden wir alle Mitarbeiternamen aus der Tabelle โempโ mithilfe einer Cursor-FOR-Schleife projizieren.
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 Erlรคuterung
- Code Zeile 2: Deklaration des Cursors guru99_det fรผr die Anweisung 'SELECT emp_name FROM emp'.
- Code Zeile 4: Die FOR-Schleife fรผr den Cursor mit der Schleifenvariablen lv_emp_name wird erstellt.
- Code Zeile 6: Drucken des Mitarbeiternamens in jeder Iteration der Schleife.
- Code Zeile 7: Die Schleife verlassen (END LOOP).
Hinweis: In einer Cursor-FOR-Schleife kรถnnen keine Cursorattribute verwendet werden, da das รffnen, Abrufen und Schlieรen des Cursors implizit durch die FOR-Schleife erfolgt.

