powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / зацикливание в курсоре
4 сообщений из 4, страница 1 из 1
зацикливание в курсоре
    #36945837
NikYarik84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Есть кусок кода, который нормально отрабатывает на MS SQL и со второго раза на SYBASE.

С первого раза этот кусок кода на SYBASE сваливается в вечный цикл и делает вечный update таблицы tResArrest

Подскажите пожалуйста в чем может быть проблема?

Вот проблемный код:
Код: 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.
declare resarrest_cursor insensitive cursor for
  select ResourceID, DateStart, InstitutionID, DecisionNum, DateEnd
    from tResArrest

open resarrest_cursor

fetch resarrest_cursor into @ResourceID,
                            @DateStart,
                            @InstitutionID,
                           @DecisionNum,
                            @DateEnd

while @@SQLSTATUS =  0 
begin

    select @ResArrestID=Offset                                     
    from tResArrestSeed  
                                         
                                        
                               
  begin tran                                        
  save tran ISEED_TR                                                       
  insert into iResArrestSeed (ZF)   
  select  0                                           
  select @ResArrestID = @ResArrestID + @@identity                      
  rollback tran ISEED_TR                            
  commit tran

  update tResArrest
     set ResArrestID = @ResArrestID
   where ResourceID    = @ResourceID
     and DateStart     = @DateStart
     and InstitutionID = @InstitutionID
     and DecisionNum   = @DecisionNum
     and DateEnd       = @DateEnd

  fetch resarrest_cursor into @ResourceID,
                              @DateStart,
                              @InstitutionID,
                              @DecisionNum,
                              @DateEnd
end

deallocate cursor resarrest_cursor  

Возможно, с синтаксисом немножко напортачил, извиняюсь, но суть запроса такая.
...
Рейтинг: 0 / 0
зацикливание в курсоре
    #36945867
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не существует базы SYBASE. Читай первый топик форума.

Не используй управление транзакциями внутри процедуры. Читай в BOL главу Nested transactions

Что такое "первый раз" который не работает и "второй раз" который работает? Если один запуск процедуры отличается от второго запуска значит первый что-то изменил в каких-то затрагиваемых таблицах. Сделай дамп всех своих таблиц между запусками и ищи разницу.
...
Рейтинг: 0 / 0
зацикливание в курсоре
    #36946055
NikYarik84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,
что значит - не использовать транзакции внутри процедуры? а где же тогда их использовать!? в BOL написано про системные процедуры, может быть Вы это имели ввиду? А по поводу того, что первый запрос что-то изменил в БД, так это только поле RestCheckID, к-рый курсор апдейтит в "вечном" цикле. При этом на каком-то этапе я отрубаю этот "долгоиграющий" процесс и в таблице остаются (как и было до курсора) 3 записи, только ID уже другие. А когда запускаю этот запрос второй раз на этой же базе, то запрос отрабатывает быстро и без рекурсий.

Нарыл в BOL'е еще инфу про Halloween problem. Может здесь ключ к разгадке? Т.е. хинтом попробовать задать определенный индекс, к-рый обеспечит table scan. Или я что-то опять важное упустил? )
...
Рейтинг: 0 / 0
зацикливание в курсоре
    #36946118
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikYarik84White Owl,
что значит - не использовать транзакции внутри процедуры? а где же тогда их использовать!?
На клиенте и только на клиенте. А по хорошему вообще не использовать.
Убери к чертовой матери begin tran и сопуствующий commit. Для того что ты делаешь одного save tran c rollback хватит.

NikYarik84А по поводу того, что первый запрос что-то изменил в БД, так это только поле RestCheckID, к-рый курсор апдейтит в "вечном" цикле. При этом на каком-то этапе я отрубаю этот "долгоиграющий" процесс и в таблице остаются (как и было до курсора) 3 записи, только ID уже другие. А когда запускаю этот запрос второй раз на этой же базе, то запрос отрабатывает быстро и без рекурсий. Еще раз повторяю: если второй запуск отрабатывает не так как первый, значит первый что-то изменил в состоянии базы. Третий запуск работает? А четвертый? А пятый?

А вообще, смотрю я на этот код и слегка недоумеваю, а для чего это все???
Пронумеровать строки? Это проще делать на клиенте.
Создать уникальный ИД для записи? Так автоинкрементное поле быстрее работать будет.
В конце-концов, если хочется развлекаться с курсорами, то в данном случае будет намного лучше делать курсор for update и обновлять его.

И еще раз: БАЗА КАКАЯ?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / зацикливание в курсоре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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