Un curseur peut être explicite ou implicite, et l'un ou l'autre type peut être utilisé dans une boucle FOR. Il y a vraiment deux aspects à votre question.
Pourquoi utiliser une boucle FOR de curseur explicite sur une boucle FOR de curseur implicite?
- Utilisez une boucle FOR de curseur explicite lorsque la requête sera réutilisée, sinon un curseur implicite est préférable.
Pourquoi utiliser une boucle avec un FETCH plutôt qu'une boucle FOR qui n'a pas de FETCH explicite?
- Utilisez un FETCH dans une boucle lorsque vous devez effectuer une collecte groupée ou lorsque vous avez besoin de SQL dynamique.
Voici quelques informations utiles de la documentation.
Exemple de curseur implicite pour boucle
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;
/
Exemple de curseur explicite pour boucle
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;
/
Curseur implicite
Un curseur implicite est un curseur de session qui est construit et géré par PL / SQL. PL / SQL ouvre un curseur implicite chaque fois que vous exécutez une instruction SELECT ou DML. Vous ne pouvez pas contrôler un curseur implicite, mais vous pouvez obtenir des informations à partir de ses attributs.
Un curseur implicite se ferme après l'exécution de son instruction associée; cependant, ses valeurs d'attribut restent disponibles jusqu'à ce qu'une autre instruction SELECT ou DML s'exécute.
Les attributs implicites du curseur sont: SQL% ISOPEN, SQL% FOUND, SQL% NOTFOUND, SQL% ROWCOUNT, SQL% BULK_ROWCOUNT, SQL% BULK_EXCEPTIONS
Curseur explicite
Un curseur explicite est un curseur de session que vous construisez et gérez. Vous devez déclarer et définir un curseur explicite, en lui donnant un nom et en l'associant à une requête (généralement, la requête renvoie plusieurs lignes). Ensuite, vous pouvez traiter l'ensemble de résultats de la requête de l'une des manières suivantes:
Ouvrez le curseur explicite (avec l'instruction OPEN), récupérez les lignes du jeu de résultats (avec l'instruction FETCH) et fermez le curseur explicite (avec l'instruction CLOSE).
Utilisez le curseur explicite dans une instruction curseur FOR LOOP (voir «Traitement du jeu de résultats de requête avec les instructions FOR LOOP du curseur»).
Vous ne pouvez pas affecter une valeur à un curseur explicite, l'utiliser dans une expression ou l'utiliser comme paramètre de sous-programme formel ou variable hôte. Vous pouvez faire ces choses avec une variable de curseur (voir "Variables de curseur").
Contrairement à un curseur implicite, vous pouvez référencer un curseur explicite ou une variable de curseur par son nom. Par conséquent, un curseur explicite ou une variable de curseur est appelé curseur nommé.
Instructions Cursor FOR LOOP
L'instruction cursor FOR LOOP vous permet d'exécuter une instruction SELECT, puis de parcourir immédiatement les lignes de l'ensemble de résultats. Cette instruction peut utiliser un curseur implicite ou explicite.
FOR
est juste une autre façon d'utiliser les curseurs. Voir les documents: docs.oracle.com/cd/E11882_01/appdev.112/e10472/… Quoi qu'il en soit, que fait htp.prn ()?