Время жизни курсора в Oracle

Если я открываю курсор и забываю закрывать его, как долго курсор будет существовать в Oracle?

Там некоторые настройки должны настроить время жизни курсора?

6
задан Peter Lang 7 June 2010 в 17:21
поделиться

2 ответа

Я считаю, что он живет до тех пор, пока ваш сеанс не уйдет или не закроет его.

Вы можете настроить время жизни курсора, закрыв его, когда закончите с ним; -)

Серьезно, полагаясь на некоторые настройки, закрывающие ваши курсоры, вы просто скрываете проблемы и продвигаете ленивое программирование. Это также может оказать пагубное влияние на любой процесс, который законно должен держать курсор открытым в течение более длительного периода времени.

2
ответ дан 17 December 2019 в 02:24
поделиться

А также ответ 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);

4
ответ дан 17 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: