Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как в секции Exception закрыть все открытые в процедуре / 10 сообщений из 10, страница 1 из 1
26.12.2002, 09:51
    #32084509
Фанат
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в секции Exception закрыть все открытые в процедуре
Курсоры?

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

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

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

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

Если у кого-то есть реальные доказательства обратного, пожалуйста пишите.
...
Рейтинг: 0 / 0
27.12.2002, 10:50
    #32085118
Славик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в секции Exception закрыть все открытые в процедуре
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
27.12.2002, 19:15
    #32085383
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в секции Exception закрыть все открытые в процедуре
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как в секции Exception закрыть все открытые в процедуре / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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