Ein Cursor kann explizit oder implizit sein, und jeder Typ kann in einer FOR-Schleife verwendet werden. Ihre Frage hat wirklich zwei Aspekte.
Warum eine explizite Cursor-FOR-Schleife über einer impliziten Cursor-FOR-Schleife verwenden?
- Verwenden Sie eine explizite Cursor-FOR-Schleife, wenn die Abfrage wiederverwendet wird. Andernfalls wird ein impliziter Cursor bevorzugt.
Warum sollte eine Schleife mit einem FETCH anstelle einer FOR-Schleife ohne expliziten FETCH verwendet werden?
- Verwenden Sie einen FETCH in einer Schleife, wenn Sie eine Massenerfassung benötigen oder wenn Sie dynamisches SQL benötigen.
Hier finden Sie einige nützliche Informationen aus der Dokumentation.
Beispiel für einen impliziten Cursor FOR LOOP
BEGIN
FOR vItems IN (
SELECT last_name
FROM employees
WHERE manager_id > 120
ORDER BY last_name
)
LOOP
DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
END LOOP;
END;
/
Beispiel für einen expliziten Cursor FOR LOOP
DECLARE
CURSOR c1 IS
SELECT last_name
FROM employees
WHERE manager_id > 120
ORDER BY last_name;
BEGIN
FOR vItems IN c1 LOOP
DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
END LOOP;
END;
/
Impliziter Cursor
Ein impliziter Cursor ist ein Sitzungscursor, der von PL / SQL erstellt und verwaltet wird. PL / SQL öffnet jedes Mal einen impliziten Cursor, wenn Sie eine SELECT- oder DML-Anweisung ausführen. Sie können einen impliziten Cursor nicht steuern, aber Sie können Informationen aus seinen Attributen abrufen.
Ein impliziter Cursor wird geschlossen, nachdem die zugehörige Anweisung ausgeführt wurde. Die Attributwerte bleiben jedoch verfügbar, bis eine andere SELECT- oder DML-Anweisung ausgeführt wird.
Die impliziten Cursorattribute sind: SQL% ISOPEN, SQL% FOUND, SQL% NOTFOUND, SQL% ROWCOUNT, SQL% BULK_ROWCOUNT, SQL% BULK_EXCEPTIONS
Expliziter Cursor
Ein expliziter Cursor ist ein Sitzungscursor, den Sie erstellen und verwalten. Sie müssen einen expliziten Cursor deklarieren und definieren, ihm einen Namen geben und ihn einer Abfrage zuordnen (normalerweise gibt die Abfrage mehrere Zeilen zurück). Anschließend können Sie die Abfrageergebnismenge auf eine der folgenden Arten verarbeiten:
Öffnen Sie den expliziten Cursor (mit der Anweisung OPEN), rufen Sie Zeilen aus der Ergebnismenge ab (mit der Anweisung FETCH) und schließen Sie den expliziten Cursor (mit der Anweisung CLOSE).
Verwenden Sie den expliziten Cursor in einer Cursor-FOR-LOOP-Anweisung (siehe "Verarbeitung der Abfrageergebnismenge mit Cursor-FOR-LOOP-Anweisungen").
Sie können einem expliziten Cursor keinen Wert zuweisen, ihn nicht in einem Ausdruck verwenden oder als formalen Unterprogrammparameter oder Hostvariable verwenden. Sie können diese Dinge mit einer Cursor-Variablen tun (siehe "Cursor-Variablen").
Im Gegensatz zu einem impliziten Cursor können Sie einen expliziten Cursor oder eine Cursor-Variable anhand ihres Namens referenzieren. Daher wird ein expliziter Cursor oder eine Cursor-Variable als benannter Cursor bezeichnet.
Cursor FOR LOOP-Anweisungen
Mit der Cursor-Anweisung FOR LOOP können Sie eine SELECT-Anweisung ausführen und dann sofort die Zeilen der Ergebnismenge durchlaufen. Diese Anweisung kann entweder einen impliziten oder einen expliziten Cursor verwenden.
FOR
ist nur eine andere Möglichkeit, Cursor zu verwenden. Siehe die Dokumente: docs.oracle.com/cd/E11882_01/appdev.112/e10472/… Was macht htp.prn ()?