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.

Oracle PL/SQL-Cursor

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.