CURSOR

SELECT Anweisung liefern in vielen Fällen mehrere Ergebnisdatensätze zurück. Um diese in PL-SQL weiter zu verarbeiten, werden CURSOR deklariert. Man unterscheidet explizite von impliziten CURSOR.

  1. Implizite CURSOR: Werden implizit von PL/SQL für jede SELECT-Anweisung definiert und hier nicht weiter betrachtet. Sie stellen lediglich Variationen der Schreibweise dar.
  2. Explizite CURSOR: Werden vom Programmierer deklariert und dienen zur Weiterverarbeitung von SELECT-Anweisungen. Da hier die für eine CURSOR-Ausführung notwendigen Aktionen sehr gut deutlich werden, beschränken wir uns auf die expliziten CURSOR.

Als Anfragen sind SQL-SELECT-Anweisungen in ihrer gesamten Syntax und Semantik zugelassen.

Beim Deklarieren wird ein Speicherbereich für die Ergebnisdatensätze reserviert, der sog. CURSOR-Bereich in dem die Ergebnidatensätze der Anfrage zwischengespeichert werden.
Beim Öffnen eines CURSORS wird die SELECT-Anfrage auf der Datenbasis ausgewertet und die Ergebnisdatensätze im CURSOR-Bereich zwischengespeichert. Spätere Änderungen an den Daten in den Tabellen haben somit keine Auswirkungen auf die Daten im RECORD-Bereich.
Bei jeder Lese-Aktion wird immer der nächste Datensatz aus dem CURSOR-Bereich in die PL/SQL-Variablen bzw. RECORD-Variablen? geladen. Ein Navigieren innerhalb der Menge der Ergebnisdatensätze ist, außer dem Lesen des nächsten Satzes, nicht möglich.
Beim Schließen wird der CURSOR-Bereich wieder freigegeben und die Datensätze sind nicht mehr zugreifbar.
Syntax der Deklaration expliziter CURSOR:

        CURSOR Cursorname  IS <SELECT-Anweisung>

Syntax des Öffenens expliziter CURSOR:

	OPEN Cursorname;

Syntax des Lesens expliziter CURSOR:

	Fetch Cursorname INTO Variablenname1 [, Variablenname2]...} | Recordvariablenname

Syntax des Schließens expliziter CURSOR:

	CLOSE Cursorname;

Attribute von expliziten CURSORN:

Der Status eines CURSORS kann abgefragt werden, indem Sie den Attributnamen dem Cursornamen voranstellen:

  • %ISOPEN: Boolesches Attribut, das TRUE ist, wenn der CURSOR geöffnet ist.
  • %FOUND: Boolesches Attribut, das TRUE ist, wenn die FETCH-Anweisung einen Datensatz geliefert hat
  • %NOTFOUND: Boolesches Attribut, das TRUE ist, wenn die letzte FETCH-Anweisung keinen Datensatz mehr geliefert hat
  • %ROWCOUNT: Gesamtanzahl der bisher gelesenen Zeilen

Beispiel:

 CREATE OR REPLACE PROCEDURE Angestellte_ausgeben IS
    v_Ang_Nr    NUMBER; 	            v_Nachname       CHAR(25);          
    v_Gehalt    NUMBER; 	            v_Abt_Nr         NUMBER; 
    v_Summe     NUMBER := 0;    	    c_komma          CHAR(4):= ', ';
    CURSOR ang_cursor IS
        SELECT Ang_Nr, Abt_Nr, Nachname, Gehalt
        FROM   Angestellte ORDER BY Abt_Nr;
 BEGIN
     OPEN ang_cursor;
     FETCH ang_cursor INTO v_Ang_Nr, v_Abt_Nr, v_Nachname, v_Gehalt;
     WHILE ang_cursor%FOUND LOOP 
         IF v_Gehalt IS NOT NULL THEN
 	    v_Summe:= v_Summe + v_Gehalt;
         END IF;
         DBMS_OUTPUT.PUT_LINE( 'Abt= '||TO_CHAR (v_Abt_Nr) || c_komma
              || 'Name= ' || (v_Nachname) || c_komma || 'Gehalt=' || TO_CHAR (v_Gehalt, 99999) 
              || c_komma || 'Summe =' || TO_CHAR (v_Summe, 999999));
         FETCH ang_cursor INTO v_Ang_Nr, v_Abt_Nr, v_Nachname, v_Gehalt;	
 END LOOP;
     CLOSE ang_cursor;
 END;

siehe auch: SELECT INTO

Quellen:

  • Faeskorn-Woyke, Heide; Bertelsmeier, Birgit; Riemer, Petra; Bauer, Elena: "Datenbanksysteme - Theorie und Praxis mit SQL2003, Oracle und MySQL", Pearson Education, München, 2007, ISBN 978-3-8273-7266-6
  • Feuerstein, Steven, Pribyl. Bill: "Oracle PL/SQL Programming", O'Reilly, 2009, ISBN-13: 978-0596514464
  • Oracle® Database SQL Language Reference 11g Release 1 (11.1) in http://docs.oracle.com/cd/B28359_01/server.111/b28286/toc.htm
  • Oracle® Database PL/SQL Language Reference 11g Release 2 (11.2) in http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/toc.htm
  • Saurabh, Gupta: "Oracle Advanced PL/SQL Developer Professional Guide", Packt Publishing Limited, 2012, ISBN 978-1-84968-722-5

Kategorie: Oracle-PL-SQL, C