Если я открываю курсор и забываю закрывать его, как долго курсор будет существовать в Oracle?
Там некоторые настройки должны настроить время жизни курсора?
Я считаю, что он живет до тех пор, пока ваш сеанс не уйдет или не закроет его.
Вы можете настроить время жизни курсора, закрыв его, когда закончите с ним; -)
Серьезно, полагаясь на некоторые настройки, закрывающие ваши курсоры, вы просто скрываете проблемы и продвигаете ленивое программирование. Это также может оказать пагубное влияние на любой процесс, который законно должен держать курсор открытым в течение более длительного периода времени.
А также ответ DCookie:
Общий шаблон времени жизни курсора -
OPEN
BIND
EXECUTE
FETCH...FETCH...FETCH
BIND
EXECUTE
FETCH...FETCH...FETCH
...
CLOSE
То есть курсор можно повторно использовать, привязав к нему новые переменные и повторно запустив его. .
PL / SQL также будет поддерживать кеш курсоров на уровне сеанса, чтобы избежать накладных расходов, связанных с повторным открытием курсора, который вы недавно закрыли. Таким образом, программно закрытый курсор может оставаться открытым. Oracle закроет их за кулисами, когда это будет необходимо.
Если курсор выходит за пределы области видимости, его можно закрыть. То есть, если вызов или процедура похожи на:
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);