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

Может это и не в этой теме надо поднимать вопрос, но ситуация следующая:
Есть функция в ракловом пакете
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function mop_isua_0(p_aid number) return number is
    cursor CheckAtom is
      select 1
        from dual
       where exists (select null
                from mop_rights_ r
               where r.uname = user
                 and r.a_id = p_aid);
    l_ret number(1) := 0;
  begin
    open CheckAtom;
    fetch CheckAtom
      into l_ret;
    close CheckAtom;
    return nvl(l_ret, 0);
  end mop_isua_0;


Есть модуль в Delphi, который отвечает за связь с БД и в нем вызов функции (она на всех формах вызывается):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function TPkMop.CheckRights(PAtomID: Integer): Integer;
begin
  GetStoreProc; //инициализация TOraStoredProc
  StoredProc.StoredProcName := 'FGV0.MOP.MOP_ISUA_0';
  StoredProc.Prepare;
  StoredProc.ParamByName('p_aid').AsInteger := PAtomID;
  StoredProc.Execute;
  Result := StoredProc.ParamByName('RESULT').Value;
end;


При запуске АРМа хожу по формам, делаю разные действия, через какое-то время
вылетает ошибка превышения кол-ва открытых курсоров.
Возникает вопрос: я ведь закрыл курсор еще в пакете, почему он остается висеть в открытых?
Как мне закрыть его? Ни Commit, ни Rollback не помогают.
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942470
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это наверное к оракловой ветке Вам нужно, а не в Delphi.

Если по существу: нафига Вам эта функция ?
Вместо ее использования можно просто написать:
WHERE EXISTS(select 1 from mop_rights_ r where uname = user and a_id = p_aid)

Ну или если Вам вот прямо нужна функция, то напишите что нибудь типа:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function mop_isua_0(p_aid number) return number is
    l_ret number(1) := 0;
begin
     select count(*) into l_ret from mop_rights_ where uname = user and a_id = p_aid;
     if l_ret > 0 then 
        return(1);
     else 
        return(0);
     end if;
end mop_isua_0;



Без всяких курсоров.
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942480
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sinemurius, ну вообще-то так и было написано, разница только в том, что обычный select - это неявный курсор.
Эта функция вызывается во многих местах и логически завершена. В v$open_cursor вызов представлен как
Код: plsql
1.
begin   :RESULT := FGV0.MOP.MOP_ISUA_0(:P_AID); end;
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942483
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий> Может это и не в этой теме надо поднимать вопрос, но ситуация следующая:
Леонов Юрий> вылетает ошибка превышения кол-ва открытых курсоров.
Леонов Юрий> ... почему он остается висеть в открытых?
Леонов Юрий> Как мне закрыть его? Ни Commit, ни Rollback не помогают.

Вопрос действительно Оракловый, не клиента.
Курсоры кешируются (и привязываются) к
сессии, не к транзакции.

Читайте про v$open_cursor, dbms_sql.close_cursor и т.д.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942490
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам

Вопрос действительно Оракловый, не клиента.
Курсоры кешируются (и привязываются) к
сессии, не к транзакции.

Можно сам вопрос перенести в другой форум или закрывать этот и создавать новый в Оракловой ветке?
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942499
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос можно закрыть, создал такой же на форуме Oracle
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942513
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрийя ведь закрыл курсор еще в пакете

Но не освободил StoredProc.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему висят открытые курсоры?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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