А также ответ DCookie:
Общий шаблон времени жизни курсора:
OPEN
BIND
EXECUTE
FETCH...FETCH...FETCH
BIND
EXECUTE
FETCH...FETCH...FETCH
...
CLOSE
То есть курсор можно использовать повторно, привязав к нему новые переменные и выполнив его повторно.
PL / SQL также будет поддерживать кэш курсоров на уровне сеанса, чтобы избежать затрат на повторное открытие недавно закрытого курсора. Таким образом, курсор, который вы программно закрыли, все еще может быть открытым. Оракул закроет их за кулисами, когда это уместно.
Если курсор выходит за рамки видимости, его можно закрыть. Это если вызов или процедура похожа на:
DECLARE
CURSOR c_1 IS SELECT ....;
BEGIN
OPEN c_1;
FETCH c_1 INTO...;
END;
затем после завершения выполнения c_1 выходит из области видимости (и не может быть снова вызван физически) и может быть закрыт. Это особенно полезно для обработки исключений, так как возможно возникновение исключения, выпрыгнув из процедуры и обходя все ваши 'CLOSE c_1;' код. Закрывая курсоры вне области видимости, вам не нужно беспокоиться о добавлении кода обработки исключений для этого.
Если ваш курсор имеет область действия сеанса (например, определенную в спецификации пакета PL / SQL или глобальном уровне тела или возвращенную клиенту через курсор ref), он никогда не выйдет из области действия таким образом, поэтому никогда не будет автоматически закрывается до отключения сеанса или через DBMS_SESSION.MODIFY_PACKAGE_STATE (DBMS_SESSION.FREE_ALL_RESOURCES);