Курсор може бути явним або неявним, і будь-який тип може бути використаний у циклі FOR. У вашому питанні дійсно два аспекти.
Навіщо використовувати явний курсор циклу FOR над неявним курсором циклу FOR?
- Використовуйте явний цикл курсора FOR, коли запит буде повторно використаний, інакше кращий неявний курсор.
Навіщо використовувати цикл FETCH, а не цикл FOR, який не має явного FETCH?
- Використовуйте FETCH всередині циклу, коли вам потрібно зібрати велику кількість або коли вам потрібен динамічний SQL.
Ось корисна інформація з документації.
Приклад неявного курсору для 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;
/
Приклад явного курсору для 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;
/
Неявний курсор
Неявний курсор - це сеансовий курсор, який будується та керується 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).
Використовуйте явний курсор у курсорі для оператора LOOP (див. "Обробка результатів запиту обробка курсором для заяв LOOP").
Ви не можете призначити значення явному курсору, використовувати його в виразі або використовувати його як формальний параметр підпрограми або змінна хост. Ви можете робити ці речі зі змінною курсору (див. "Змінні курсори").
На відміну від неявного курсору, ви можете посилатися на явний курсор або змінну курсора за його назвою. Тому явний курсор або змінна курсору називається названим курсором.
Курсор для заяв про LOOP
Курсор для оператора LOOP дозволяє запустити оператор SELECT, а потім негайно провести цикл через рядки набору результатів. Це твердження може використовувати або неявний, або явний курсор.
FOR
- лише інший спосіб використання курсорів. Дивіться документи: docs.oracle.com/cd/E11882_01/appdev.112/e10472/… Як би там не було, що робить htp.prn ()?