Cursor Jedes SQL Statement, das der Oracle Server ausführt, hat einen individuellen Cursor, der verbunden ist mit: Explizite Cursor • Implizitem Cursor: Declariert für alle DML-Statements und PL/SQL SELECT Statements. • Explizitem Cursor: Declariert und benannt vom Programmierer Copyright © Oracle Corporation, 1998. All rights reserved. 21-2 Explizite Cursor Funktionen Copyright © Oracle Corporation, 1998. All rights reserved. Steuerung des expliziten Cursors Nein Ergebnis Cursor 21-3 7369 SMITH CLERK 7566 JONES MANAGER 7788 SCOTT ANALYST 7876 ADAMS CLERK 7902 FORD ANALYST Copyright © Oracle Corporation, 1998. All rights reserved. Ja Deklaration OPEN FETCH LEER? CLOSE Aktuelles Tupel • Lege einen • Identifiziere • Lade das benannten Cursor an (CREATE) 21-4 die aktiven Attribute aktive Tupel in die Variable • Teste, ob • Verlasse Tupel existieren die aktiven Attribute • Rückgabe mit FETCH, wenn Tupel gefunden wurden Copyright © Oracle Corporation, 1998. All rights reserved. Steuerung des expliziten Cursors Deklaration eines Cursors Öffne den Cursor (OPEN) Zeiger Cursor Syntax Rufe ein Tupel mit dem Cursor ab (FETCH) Zeiger Cursor CURSOR cursor_name IS select_statement; Führe fort, bis kein Tupel mehr vorhanden ist Zeiger • Keine INTO-Klausel in der Cursor-Deklaration Cursor Schließe den Cursor (CLOSE) Cursor Copyright © Oracle Corporation, 1998. All rights reserved. 21-5 Copyright © Oracle Corporation, 1998. All rights reserved. 21-6 Deklaration eines Cursors Beispiel Öffnen des Cursors Syntax DECLARE CURSOR c1 IS SELECT empno, ename FROM emp; CURSOR c2 IS SELECT * FROM dept WHERE deptno = 10; BEGIN ... OPEN cursor_name; • Öffne den Cursor zur Ausführung der Anfrage und zur Identifizierung des Attribut-Sets. • Wenn die Anfrage keine Tupel zurückgibt wird keine Ausnahme angegeben (keine Fehlermeldung). • Cursor-Attribute testen nach FETCH. 21-7 Copyright © Oracle Corporation, 1998. All rights reserved. 21-8 Copyright © Oracle Corporation, 1998. All rights reserved. Daten vom Cursor holen Daten vom Cursor holen Syntax FETCH cursor_name INTO [variable1, variable2, ...] | record_name]; • Die aktiven Tupelwerte in die OutputVariablen speichern. • Die gleiche Anzahl von Variablen bereitstellen • Die Variablen werden von ihrer Position mit den Spalten verbunden. • Überprüfen, ob die richtigen Attribute in den Variablen gespeichert sind.. 21-9 Copyright © Oracle Corporation, 1998. All rights reserved. Cursor schließen Syntax CLOSE cursor_name; • Nach dem kompletten Einlesen wird der Cursor geschlossen Beispiele FETCH c1 INTO v_empno, v_ename; ... OPEN defined_cursor; LOOP FETCH defined_cursor INTO defined_variables EXIT WHEN ...; ... -- Process the retrieved data ... END; Copyright © Oracle Corporation, 1998. All rights reserved. 21-10 Explizite Cursor Attribute Man erhält Statusinformationen über einen Cursor. Attribut Typ Beschreibung %ISOPEN Boolean TRUE, wenn der Cursor offen ist %NOTFOUND Boolean TRUE, wenn keine Tupel zurückgegeben wurden %FOUND Boolean TRUE, wenn Tupel zurückgegeben wurden; Komplement zu %NOTFOUND %ROWCOUNT Number Anzahl der zurückgegebenen Tupel • Vom geschlossenen Cursor können keine Daten geholt werden. • Cursor müsste wiedereröffnet werden 21-11 Copyright © Oracle Corporation, 1998. All rights reserved. 21-12 Copyright © Oracle Corporation, 1998. All rights reserved. Steuerung mehrfaches holen Cursor anwenden Beispiel: • Mehrere Tupel werden mit einem expliziten Cursor in einer Schleife geholt. • In jedem Schritt wird ein Tupel geholt. • Mit dem %NOTFOUND Attribut wird getestet, ob noch Tupel vorhanden waren. Copyright © Oracle Corporation, 1998. All rights reserved. 21-13 DECLARE CURSOR c1 IS SELECT empno, ename FROM emp; v_empno emp.empno%TYPE; v_ename emp.ename%Type; OPEN c1; LOOP FETCH c1 INTO v_empno, v_ename; EXIT WHEN c1%NOTFOUND; -- Datenmanipulation oder.. END LOOP; CLOSE c1; END; 21-14 Das %ISOPEN Attribut Das %NOTFOUND und das %ROWCOUNT Attribut • Tupel können nur geholt werden, wenn der Cursor offen ist. • Mit dem %ISOPEN Cursorattribut kann gefragt werden, ob der Cursor offen ist. Beispiel IF NOT c1%ISOPEN THEN OPEN c1; END IF; LOOP FETCH c1... 21-15 Copyright © Oracle Corporation, 1998. All rights reserved. Copyright © Oracle Corporation, 1998. All rights reserved. • Mit dem %ROWCOUNT Cursorattribut wird die exakte Anzahl der geholten Tupel ermittelt. • Mit dem %NOTFOUND Cursorattribut wird ermittelt, wann die Schleife verlassen werden muss. 21-16 Copyright © Oracle Corporation, 1998. All rights reserved. Cursor und Records Die Werte der bearbeiteten Tupel im aktiven Set werden oftmals in einem PL/SQL RECORD gespeichert. Example ... CURSOR c1 IS SELECT empno, ename FROM emp; emp_record c1%ROWTYPE; BEGIN OPEN c1; . . . FETCH c1 INTO emp_record; Copyright © Oracle Corporation, 1998. All rights reserved. 21-17 Cursor FOR Schleifen Syntax FOR record_name IN cursor_name LOOP statement1; statement2; . . . END LOOP; • Verkürzen der Bearbeitung. • Implizites open, fetch und close wird angewandt. • Der RECORD muss nicht deklariert werden - er ist implizit deklariert. Copyright © Oracle Corporation, 1998. All rights reserved. 21-18 Cursor FOR Schleifen Cursor FOR Schleifen mit Unterabfragen Alle Angestellten werden einzeln durchmustert, bis die Bedingung erfüllt ist. Man muss den Cursor nicht deklarieren. Beispiel Beispiel DECLARE CURSOR c1 IS SELECT empno, ename FROM emp; BEGIN FOR emp_record IN c1 LOOP -- implizites Open und implizites Fetch IF emp_record.empno = 7839 THEN ... END LOOP; -- implizites Close END; 21-19 Copyright © Oracle Corporation, 1998. All rights reserved. BEGIN FOR emp_record IN ( SELECT empno, ename FROM emp) LOOP -- implizites Open und implizites Fetch IF emp_record.empno = 7839 THEN ... END LOOP; -- implizites Close END; 21-20 Copyright © Oracle Corporation, 1998. All rights reserved. Zusammenfassung • Cursortypen: – Implizite Cursor: Für alle DML Statements und single-row queries. – Explizite Cursor: Für Anfragen auf null, eine oder mehrere Tupel. Links • http://www.datenbank-plsql.de • http://www.db.cs.ucdavis.edu/ teaching/sqltutorial/ • http://infolab.stanford.edu/ ~ullman/fcdb/oracle/or-plsql.html • Veränderungen mit expliziten Cursor. • http://www.a-wilde.de/hp/studium/db/plsql4.htm • Überprüfen des Cursorstatus mit den Cursorattributen. • http://www.dke.jku.at/teaching/exams/ dke/uebungsstoff/plsql.pdf • Benutze die Cursor FOR Schleife. • http://sheikyerbouti.developpez.com/pl_sql/ 21-21 Copyright © Oracle Corporation, 1998. All rights reserved. 21-22 Copyright © Oracle Corporation, 1998. All rights reserved.