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, die alle Informationen zur Anweisung enthält.
Mit PL / SQL kann der Programmierer den Kontextbereich über den Cursor steuern. Ein Cursor enthält die von der SQL-Anweisung zurückgegebenen Zeilen. Der Satz von Zeilen, den der Cursor enthält, wird als aktiver Satz bezeichnet. Diese Cursor können auch so benannt werden, dass sie von einer anderen Stelle des Codes aus referenziert werden können.
In diesem Tutorial lernen Sie:
- Impliziter Cursor
- Expliziter Cursor
- Cursorattribute
- FOR-Schleifen-Cursor-Anweisung
Es gibt zwei Arten von Cursoren.
- Impliziter Cursor
- Expliziter Cursor
Impliziter Cursor
Immer wenn DML-Operationen in der Datenbank auftreten, 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 neuesten Cursor verweisen.
Expliziter Cursor
Programmierer dürfen benannte Kontextbereiche erstellen, um ihre DML-Operationen auszuführen und mehr Kontrolle darüber zu erhalten. Der explizite Cursor sollte im Deklarationsabschnitt des PL / SQL-Blocks definiert werden und wird für die Anweisung 'SELECT' erstellt, die im Code verwendet werden muss.
Im Folgenden finden Sie Schritte zum Arbeiten mit expliziten Cursorn.
- Cursor deklarieren
Das Deklarieren des Cursors bedeutet einfach, einen benannten Kontextbereich für die im Deklarationsteil definierte Anweisung 'SELECT' zu erstellen. Der Name dieses Kontextbereichs entspricht dem Cursornamen.
- Cursor öffnen
Durch Öffnen des Cursors wird PL / SQL angewiesen, den Speicher für diesen Cursor zuzuweisen. Dadurch wird der Cursor zum Abrufen der Datensätze bereit.
- Daten vom Cursor abrufen
In diesem Prozess wird die Anweisung 'SELECT' 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. Dies bedeutet, dass wir Datensatz für Datensatz auf die Daten zugreifen können.
Jede Abrufanweisung ruft einen aktiven Satz ab und enthält die Informationen dieses bestimmten Datensatzes. Diese Anweisung entspricht der Anweisung 'SELECT', die den Datensatz abruft und der Variablen in der Klausel 'INTO' zuweist, jedoch keine Ausnahmen auslöst.
- Cursor schließen
Sobald der gesamte Datensatz abgerufen wurde, müssen wir den Cursor schließen, damit der diesem Kontextbereich zugewiesene Speicher freigegeben wird.
Syntax:
DECLARECURSORIS
- In der obigen Syntax enthält der Deklarationsteil die Deklaration des Cursors und der Cursor-Variablen, in der die abgerufenen Daten zugewiesen werden.
- Der Cursor wird für die 'SELECT'-Anweisung erstellt, die in der Cursor-Deklaration angegeben ist.
- Im Ausführungsteil wird der deklarierte Cursor geöffnet, abgerufen und geschlossen.
Cursorattribute
Sowohl der implizite Cursor als auch der explizite Cursor verfügen über bestimmte Attribute, auf die zugegriffen werden kann. Diese Attribute enthalten weitere Informationen zu den Cursoroperationen. Nachfolgend sind die verschiedenen Cursorattribute und ihre Verwendung aufgeführt.
Cursorattribut | Beschreibung |
% GEFUNDEN | Es gibt das boolesche Ergebnis 'TRUE' zurück, wenn die letzte Abrufoperation einen Datensatz erfolgreich abgerufen hat, andernfalls wird FALSE zurückgegeben. |
%NICHT GEFUNDEN | Dies funktioniert im Gegensatz zu% FOUND und gibt 'TRUE' zurück, wenn der letzte Abrufvorgang keinen Datensatz abrufen 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 1 : In diesem Beispiel wird gezeigt, wie der explizite Cursor deklariert, geöffnet, abgerufen und geschlossen wird.
Wir werden den gesamten Namen des Mitarbeiters mit einem Cursor aus der Tabelle emp projizieren. Wir werden auch das Cursorattribut verwenden, um die Schleife so einzustellen, dass der gesamte Datensatz vom Cursor abgerufen wird.
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:/
Ausgabe
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Code Erläuterung:
- Codezeile 2 : Deklarieren des Cursors guru99_det für die Anweisung 'SELECT emp_name FROM emp'.
- Codezeile 3 : Deklarieren der Variablen lv_emp_name.
- 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 Cursorattribut '% NOTFOUND', um festzustellen, ob der gesamte Datensatz im Cursor abgerufen wurde. Wenn es abgerufen wird, gibt es 'TRUE' zurück und das Steuerelement verlässt die Schleife. Andernfalls ruft das Steuerelement die Daten weiterhin vom Cursor ab und druckt die Daten.
- Codezeile 11: EXIT-Bedingung für die Schleifenanweisung.
- Codezeile 12: Drucken Sie den abgerufenen Mitarbeiternamen.
- Codezeile 14: Verwenden Sie das Cursorattribut '% ROWCOUNT', um die Gesamtzahl der Datensätze zu ermitteln, die im Cursor betroffen / abgerufen wurden.
- Codezeile 15: Nach dem 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 den Cursornamen anstelle der Bereichsbegrenzung in der FOR-Schleifenanweisung angeben, damit die Schleife vom ersten Datensatz des Cursors bis zum letzten Datensatz des Cursors funktioniert. Die Cursor-Variable, das Öffnen des Cursors, das Abrufen und Schließen des Cursors werden implizit von der FOR-Schleife ausgeführt.
Syntax:
DECLARECURSORIS
- In der obigen Syntax enthält der Deklarationsteil die Deklaration des Cursors.
- Der Cursor wird für die 'SELECT'-Anweisung erstellt, die in der Cursor-Deklaration 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 Cursor-Variable.
Beispiel 1 : In diesem Beispiel projizieren wir den gesamten Mitarbeiternamen aus der emp-Tabelle mithilfe einer Cursor-FOR-Schleife.
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;/
Ausgabe
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Code Erläuterung:
- Codezeile 2 : Deklarieren des Cursors guru99_det für die Anweisung 'SELECT emp_name FROM emp'.
- Codezeile 4 : Erstellen 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: Verlassen Sie die Schleife
Hinweis: In der Cursor-FOR-Schleife können Cursorattribute nicht verwendet werden, da das Öffnen, Abrufen und Schließen des Cursors implizit durch die FOR-Schleife erfolgt.