powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как в секции Exception закрыть все открытые в процедуре
10 сообщений из 10, страница 1 из 1
Как в секции Exception закрыть все открытые в процедуре
    #32084509
Фанат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курсоры?

чтонть покрасивее перебора всех через %isopen есть?
...
Рейтинг: 0 / 0
Как в секции Exception закрыть все открытые в процедуре
    #32084515
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При выходе из процедуры они автоматически все должны закрыться
...
Рейтинг: 0 / 0
Как в секции Exception закрыть все открытые в процедуре
    #32084518
Фанат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это при нормальном выходе

Open cursor
...
oшибка
| ...
| Close cursor
|
V
Exception
и курсор остается "повисшим"....
...
Рейтинг: 0 / 0
Как в секции Exception закрыть все открытые в процедуре
    #32084521
non
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При выходе из процедуры они автоматически все должны закрыться

Зачем тогда нужна команда Close?
...
Рейтинг: 0 / 0
Как в секции Exception закрыть все открытые в процедуре
    #32084523
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что значит повисший?
Как после отработки процедуры ты проверяешь, что курсор открыт?
...
Рейтинг: 0 / 0
Как в секции Exception закрыть все открытые в процедуре
    #32084541
non
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Trace
...
Рейтинг: 0 / 0
Как в секции Exception закрыть все открытые в процедуре
    #32085034
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курсор автоматически закрывается только если он открыт в цикле for ...
Если он открыт явно, его нужно явно закрыть.
Посему красивых способов закрыть все открытые курсоры нет, только cr%isopen.
Сожалею но сие так.
...
Рейтинг: 0 / 0
Как в секции Exception закрыть все открытые в процедуре
    #32085050
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожаление не могу сейчас привести подтверждение из документации, попытаюсь рассуждать логически.
Если мы рассматриваем обычную процедуру или функцию, то все переменные обьявленные в них(локальные) автоматически уничтожаются по завершении процедуры.
Этот принцип используется во всех языках программирования.
Как известно в PL/SQL только через использование пакетных(модульных) переменных можно сделать глобальные переменные.

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

Если у кого-то есть реальные доказательства обратного, пожалуйста пишите.
...
Рейтинг: 0 / 0
Как в секции Exception закрыть все открытые в процедуре
    #32085118
Славик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softbuilder прав:
все переменные обьявленные в них(локальные) автоматически уничтожаются по завершении процедуры.
А ФАНАТ, скорее всего использует глобальные курсоры объявленные в пакете.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE OR REPLACE PACKAGE test_pack
IS
   PROCEDURE test;
END test_pack;
/

CREATE OR REPLACE PACKAGE BODY test_pack
AS
   CURSOR c1
   IS
      SELECT SYSDATE
        FROM DUAL;

   dt   DATE;

   PROCEDURE test
   IS
   BEGIN
      OPEN c1;
      FETCH c1 INTO dt;
      raise_application_error (- 20001 , 'error');
      CLOSE c1;
   END;
END test_pack;
/
/ 


Соответственно вызвав процедуру 2-й раз, получаем ошибку: Курсор открыт!
...
Рейтинг: 0 / 0
Как в секции Exception закрыть все открытые в процедуре
    #32085383
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Chto sporit - eto proveriaetsia v 5 minut:

ispolzuia statistiku sessii
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
SQL> select n.name, m.value
from  v$mystat m, v$statname n
where m.statistic# = n.statistic#
      and
      n.name in ('opened cursors cumulative',
                 'opened cursors current');

NAME						      VALUE
 ----------------------------------------------------- ----------
 
opened cursors cumulative				  48 
opened cursors current					   1 

SQL> declare
 cursor cr is select  1  from dual;
 n number;
begin
 open cr;
 fetch cr into n;
 dbms_output.put_line('\nn = '||to_char(n));
 close cr;
exception when others then
 if cr%isopen then close cr; end if;
end;
/

PL/SQL procedure successfully completed.

SQL> select n.name, m.value
from  v$mystat m, v$statname n
where m.statistic# = n.statistic#
      and
      n.name in ('opened cursors cumulative',
                 'opened cursors current');

NAME						      VALUE
 ----------------------------------------------------- ----------
 
opened cursors cumulative				  51 
opened cursors current					   1 

SQL> declare
 cursor cr is select  1  from dual;
 n number;
begin
 open cr;
 fetch cr into n;
 dbms_output.put_line('\nn = '||to_char(n));
 -- close cr;
 
 --exception when others then
 
 -- if cr%isopen then close cr; end if;
 
end;
/

PL/SQL procedure successfully completed.

SQL> select n.name, m.value
from  v$mystat m, v$statname n
where m.statistic# = n.statistic#
      and
      n.name in ('opened cursors cumulative',
                 'opened cursors current');

NAME						      VALUE
 ----------------------------------------------------- ----------
 
opened cursors cumulative				  54 
opened cursors current					   1 

SQL> select n.name, m.value
from  v$mystat m, v$statname n
where m.statistic# = n.statistic#
      and
      n.name in ('opened cursors cumulative',
                 'opened cursors current');


moget bit kursor ostaetsia gdeto v sistemnoy oblasti (i uhodit iz statistiki sessii) ?
ispolzuia system statistics
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
SQL> select name, value
from  v$sysstat
where name in ('opened cursors cumulative',
               'opened cursors current');

NAME								      VALUE
 ---------------------------------------------------------------- ----------
 
opened cursors cumulative					     3044385 
opened cursors current							   1 

SQL> declare
 cursor cr is select  1  from dual;
 n number;
begin
 open cr;
 fetch cr into n;
 dbms_output.put_line('\nn = '||to_char(n));
 close cr;
exception when others then
 if cr%isopen then close cr; end if;
end;
/

PL/SQL procedure successfully completed.

SQL> select name, value
from  v$sysstat
where name in ('opened cursors cumulative',
               'opened cursors current');
   2      3      4 
NAME								      VALUE
 ---------------------------------------------------------------- ----------
 
opened cursors cumulative					     3044448 
opened cursors current							   1 

SQL> declare
 cursor cr is select  1  from dual;
 n number;
begin
 open cr;
 fetch cr into n;
 dbms_output.put_line('\nn = '||to_char(n));
 -- close cr;
 
 --exception when others then
 
 -- if cr%isopen then close cr; end if;
 
end;
/

PL/SQL procedure successfully completed.

SQL> select name, value
from  v$sysstat
where name in ('opened cursors cumulative',
               'opened cursors current');

NAME								      VALUE
 ---------------------------------------------------------------- ----------
 
opened cursors cumulative					     3044451 
opened cursors current							   1 


vivod -- po krainey mere dlia neimennovannih progpammnih blokov cursor zakrivaetsia pri
vihode iz bloka.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как в секции Exception закрыть все открытые в процедуре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]