Курсор может быть явным или неявным, и любой тип может использоваться в цикле FOR. На самом деле есть два аспекта вашего вопроса.
Зачем использовать явный курсорный цикл FOR над неявным курсорным циклом FOR?
- Используйте явный курсор для цикла FOR, когда запрос будет использоваться повторно, в противном случае предпочтителен неявный курсор.
Зачем использовать цикл с FETCH, а не цикл FOR, который не имеет явного FETCH?
- Используйте FETCH внутри цикла, когда вам нужно выполнить массовый сбор или когда вам нужен динамический SQL.
Вот некоторая полезная информация из документации.
Пример неявного курсора 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;
/
Пример явного курсора для цикла
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;
/
Неявный курсор
Неявный курсор - это курсор сеанса, который создается и управляется PL / SQL. PL / SQL открывает неявный курсор каждый раз, когда вы запускаете оператор SELECT или DML. Вы не можете управлять неявным курсором, но вы можете получить информацию из его атрибутов.
Неявный курсор закрывается после выполнения соответствующего оператора; однако значения его атрибутов остаются доступными до выполнения другого оператора SELECT или DML.
Неявные атрибуты курсора: SQL% ISOPEN, SQL% FOUND, SQL% NOTFOUND, SQL% ROWCOUNT, SQL% BULK_ROWCOUNT, SQL% BULK_EXCEPTIONS
Явный курсор
Явный курсор - это курсор сеанса, который вы создаете и управляете им. Вы должны объявить и определить явный курсор, присвоив ему имя и связав его с запросом (обычно запрос возвращает несколько строк). Затем вы можете обработать набор результатов запроса одним из следующих способов:
Откройте явный курсор (с помощью оператора OPEN), извлеките строки из результирующего набора (с помощью оператора FETCH) и закройте явный курсор (с помощью оператора CLOSE).
Используйте явный курсор в операторе курсора FOR LOOP (см. «Обработка набора результатов запроса с помощью операторов Cursor FOR LOOP»).
Вы не можете присвоить значение явному курсору, использовать его в выражении или использовать в качестве формального параметра подпрограммы или переменной хоста. Вы можете сделать это с помощью переменной курсора (см. «Переменные курсора»).
В отличие от неявного курсора, вы можете ссылаться на явный курсор или переменную курсора по его имени. Поэтому явный курсор или переменная курсора называется именованным курсором.
Курсор для операторов LOOP
Оператор курсора FOR LOOP позволяет запустить инструкцию SELECT, а затем сразу же выполнить цикл по строкам набора результатов. Этот оператор может использовать неявный или явный курсор.
FOR
просто еще один способ использовать курсоры. Смотрите документы: docs.oracle.com/cd/E11882_01/appdev.112/e10472/… В любом случае, что делает htp.prn ()?