powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Cursor not open
7 сообщений из 7, страница 1 из 1
Cursor not open
    #36447558
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASA 9.0.2.3044
Клиент подключается через ODBC.
Приложение только вызывает SP которые возвращают resulset.
С недавних пор при вызове процедур стали появлятся следующие ошибки.
На какой то вызов (произвольной) процедуры выдается "Cursor not open",
а далее на все последующие обращения завершаются с "Cursor already open".
Сами процедуры курсоров не используют, за исключением одной в которой есть цикл for.
Снял лог с сервера.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
02/03 15:38:47.684 ** REQUEST conn: 69    STMT_PREPARE            "call DBA.sp_GetInfo(?)"
02/03 15:38:47.684 ** DONE    conn: 69    STMT_PREPARE            Stmt=96525 
02/03 15:38:47.685 ** REQUEST conn: 69    CURSOR_OPEN             Stmt=96525 
02/03 15:38:47.685 ** HOSTVAR conn: 69    0 unsigned int '1101244800'
02/03 15:38:47.685 ** DONE    conn: 69    CURSOR_OPEN             Crsr=0 
02/03 15:38:47.686 ** ERROR   conn: 69    code: -180 "Cursor not open"
02/03 15:38:47.692 ** REQUEST conn: 69    COMMIT                  
02/03 15:38:47.692 ** DONE    conn: 69    COMMIT                  
02/03 15:38:47.707 ** REQUEST conn: 69    STMT_DROP               Stmt=96525 
02/03 15:38:47.707 ** DONE    conn: 69    STMT_DROP               
02/03 15:38:47.707 ** REQUEST conn: 69    STMT_PREPARE            "call DBA.sp_GetInfo(?)"
02/03 15:38:47.707 ** DONE    conn: 69    STMT_PREPARE            Stmt=96526 
02/03 15:38:47.709 ** REQUEST conn: 69    CURSOR_OPEN             Stmt=96526 
02/03 15:38:47.709 ** ERROR   conn: 69    code: -172 "Cursor already open"
02/03 15:38:47.709 ** DONE    conn: 69    CURSOR_OPEN             Crsr=0 
02/03 15:38:47.718 ** REQUEST conn: 69    COMMIT                  
02/03 15:38:47.718 ** DONE    conn: 69    COMMIT                  
Вот текст процедуры(Изменены названия полей и таблицы)
Код: plaintext
1.
2.
3.
4.
ALTER PROCEDURE "DBA"."sp_GetInfo"(inID unsigned int)
begin
  select f1,f2,f3 from DBA.SOME_TABLE where ID=inID;
end
Естественно до часа X все работало(больше 2-х лет). Нгрузка особо не менялась.
При чем есть инсталяции с намного большей нагрузкой.
Из изменений на компьютерах только обновления Windows.
...
Рейтинг: 0 / 0
Cursor not open
    #36449667
KOLCHOZ_POSTEVENT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зверь знакомый.
Значится так, просмотрите ВСЕ ВОЗМОЖНЫЕ выходы из процедуры.
Где то есть , или RETURN или GOTO, выводящий на завершение.
Вот перед ними поставьте CLOSE CURSOR_NAME и deallocate cursor CURSOR_NAME .
...
Рейтинг: 0 / 0
Cursor not open
    #36449760
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KOLCHOZ_POSTEVENTЗначится так, просмотрите ВСЕ ВОЗМОЖНЫЕ выходы из процедуры.
Я привел полный текст конкретной процедуры.
Одна строчка - выборка из реальной таблицы(не view).
Сейчас сделал явное перечисление всех полей resulseta.
Это одна процедура у которой они явно не заданы.

Курсоры используются только в одной другой процедуре как
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
label_loop:
for for_name as cursor_name cursor for
  select ...
for read only 
do
  ...
  if(...)then
    leave label_loop;
  end if;
  ...
end for;
Я так понимаю что такие курсоры явно не надо закрывать.
Эта функция тоже вызывается достаточно интенсивно, но на ней
такого поведения пока не замечено.
И еще все это работало и продолжает работать на других инсталляциях
с большей нагрузкой.
...
Рейтинг: 0 / 0
Cursor not open
    #36449873
KOLCHOZ_POSTEVENT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Синтакс какой-то незнакомый.
Но так, интуитивно, сделать бы закрылку после end for, а чо, есть не просит.
У моих клиентов такое сообщение появилось, когда вышли на продакшн , а там хлынули данные, коорые выносили процедуру на останов, перепрыгивая через CLOSE и DEALLOCATE.
Ну, клиенты сразу полезли на каланчу, типа, ты чо с сервером сделал?
А я смотрю в сообщение-а там же по-русски сказанно:cursor not closed, ну просмотрел процу, нашёл ещё один выход для тривиальной информации, закрыл его, их-же кодом, что характерно, из конца процедуры, пошло.
А добавить мне больше нечего, чем богаты, так сказать.
...
Рейтинг: 0 / 0
Cursor not open
    #36450414
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moteus,
Если я правильно читаю ODBC лог, то я не понимаю как этот код может вообще где-то работать. Между STMT_PREPARE команды с вопросительным знаком внутри и CURSOR_OPEN должен обязательно идти BIND_PARAM. А этого я в логе не вижу...
Зато я вижу что CURSOR_OPEN пытается работать с параметром привязаным к случайному месту памяти.


KOLCHOZ_POSTEVENTСинтакс какой-то незнакомый.
Но так, интуитивно, сделать бы закрылку после end for, а чо, есть не просит.Это синтаксис WatcomSQL и закрывать курсор там действительно не нужно. И даже более того - вредно. Автоматические курсоры внутри FOR циклов закрываются автоматически при покидании его. Подробнее читать в BOL главу:
SQL Anywhere Server - SQL Reference » Using SQL » SQL statements » SQL statements (E-O) » FOR statement
...
Рейтинг: 0 / 0
Cursor not open
    #36450558
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕсли я правильно читаю ODBC лог, то я не понимаю как этот код может вообще где-то работать.
:)
Вроде работает правильно.

Ну все запросы вполняются по схеме
1) SQLAllocHandle(SQL_HANDLE_STMT, ...
2) SQLBindParameter(stmt, ...
3) SQLExecDirect(stmt, ...
4) SQLBindCol(stmt, ...
5) SQLFetch(stmt)

Явно вызывать SQLPrepare и держать кэш подготовленных запросов пока не удается.
...
Рейтинг: 0 / 0
Cursor not open
    #36450570
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сколько я понял это и есть передача параметра
Код: plaintext
02/03 15:38:47.685 ** HOSTVAR conn: 69    0 unsigned int '1101244800'

Если в процедуру передается несколько параметров то они в логах идут подряд
с соответствующими номерами (0..N)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Cursor not open
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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