Im PL/SQL werden Cursor genutzt um Daten aus Datenbanktabellen abzufragen.
Hierbei gibt es unterschiedliche Möglichkeiten die Cursor zu benutzen.

1. Implizite Cursor

Implizite Cursor sind nicht sichtbar sondern werden automatisch beim Aufruf eines SQL-Kommandos erzeugt.

declare
  vEmployeeId number;
begin
  select EMPLOYEE_ID into vEmployeeId from EMPLOYEES where LAST_NAME = 'Mavris';
exception
 when NO_DATA_FOUND then
   vEmployeeId := 0;
 when TOO_MANY_ROWS then
   vEmployeeId := 0;
end;

Hierbei ist der Anwender jedoch sehr eingeschränkt. Da wie im obigen Beispiel nur ein Datensatz als Ergebnis zurückkommen darf, da es ansonsten zu einer Fehlermeldung (TOO_MANY_ROWS) kommt. Kommt dagegen gar kein Ergebnis zurück wird ebenso ein Fehler (NO_DATA_FOUND) geworfen. Implizite Cursor sollen daher nur verwendet werden, wenn genau ein Datensatz erwartet wird bzw. die mögliche ORA-Fehler mittels EXCEPTION gefangen werden.

2. Explizite Cursor

Explizite Cursor werden im DECLARE-Block angegeben und anschließend im eigentlichen Programmteil abgefragt. Mittels ‚open‘ wird der Cursor dann geöffnet. Die Daten welche der Cursor nun liefert werden mit ‚fetch‘ einzeln geholt. Nach dem Abfragen der Daten muss der Cursor mittels ‚close‘ geschlossen werden.

Beispiel:

declare
 vLastName varchar2(25);
 cursor cCur is select LAST_NAME from EMPLOYEES;
begin
 open cCur;
 loop
  fetch cCur into vLastName;
  exit when cCur%notfound;
  -- Ausgabe des LAST_NAME
  dbms_output.put_line(vLastName);
 end loop;
 close cCur;
end;

Um an allen Daten zu kommen müssen diese über eine Schleife (loop) einzeln aus dem Cursor geholt werden. Die Daten (LAST_NAME) werden dabei in Variablen gespeichert (into vLastNAME). Das Schlüsselwort ‚exit‘ wird benötigt um die Schleife wieder zu verlassen, wenn keine Daten mehr durch den Cursor bereitgestellt werden. Dies wird erreicht in dem das Cursorattribut ‚%notfound‘ abgefragt wird.

Alle Cursorattribute im Überblick:

  • %notfound – ist auf TRUE wenn beim Abfragen des Cursor durch FETCH keine Daten mehr geliefert werden
  • %found – Gegenteil zu %notfound: ist auf TRUE wenn beim Abfragen des Cursor durch FETCH Daten geliefert werden
  • %rowcount – Liefert die Anzahl der bereits geholten (durch FETCH) Datensätze
  • %isopen – liefert TRUE falls der Cursor geöffnet ist (durch OPEN) und noch nicht geschlossen wurde (durch CLOSE)

Um das Abfragen von Daten weiter zu vereinfachen gibt es auch die Möglichkeit sich den Cursor automatisch öffnen und schließen zu lassen. Als weitere Vereinfachung müssen die Variablen um die Ergebnisspalten zu speichern ebenfalls nicht deklariert werden. Die Datensätze werden weiterhin automatisch gefetcht und in einer Struktur gespeichert.

Beispiel: FOR-CURSOR-LOOP

declare
 cursor cCur is select * from employees;
begin
 for vCurData in cCur
 loop
  dbms_output.put_line(vCurData.FIRST_NAME || ' ' || vCurData.LAST_NAME);
 end loop;
end;

Die FOR-Schleife öffnet den Cursor und pro Schleifendurchlauf werden die Daten in der Struktur vCurData (Name frei wählbar) hinterlegt. Auf die Daten in vCurData kann mittels ‚.‘ und dem Spaltenname zugegriffen werden (vCurData.LAST_NAME). Nachdem alle Daten geholt wurden beendet sich die Schleife automatisch und schließt den Cursor.

Kommentare sind derzeit nicht möglich.

   
Impressum Suffusion theme by Sayontan Sinha