Explizite Cursor

Werbung
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.
Herunterladen