powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с курсором
17 сообщений из 17, страница 1 из 1
Помогите с курсором
    #32048877
mick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скажите, если у меня есть несколько сеансов одного пользователя (1С SQL), все они выполняют одну хранимую процедуру в которой используется курсор, то не виден ли он случайно несколькими пользователями одновременно.
Т.е. не видна ли всеми одновременно переменная @@fetch_status?
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048879
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курсор глобальный или локальный ?
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048881
mick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Локальный
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048882
vadim_march
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю надо так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
declare @cou int
set @cou = (select count(*) from tbl)
while @cou >  0  
fetch
...
set @cou = @cou -  1 
end  --while
 
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048895
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadim_march, а что вы хотели сказать этим циклом, если не секрет?

mick, @@fetch_status для разных коннектов будет разный. Если курсор локальный, то вообще никаких конфликтов быть не должно.
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048897
vadim_march
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>GreenSunrise
Под циклом я понимал место, где используется курсор. Когда у меня была проблема с @@FETCH_STATUS. я просто пересчитал строчки в @cou и и спользовал как счетчик ...
А @@FETCH_STATUS я больше не пользуюсь :)
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048899
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жуть какая. А какие проблемы были с @@fetch_status? Можа, дело вовсе не в бобине?

Единственная ситуация (при описанных выше условиях), когда я могу представить проблему - это вложенные курсоры. Вот тогда статус (не count!) надо сохранять в переменной и проверять именно ее.
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048901
vadim_march
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этой конструкции
Код: plaintext
1.
2.
3.
WHILE @@FETCH_STATUS =  0 
BEGIN
   FETCH NEXT FROM @Cursor
END

я не выпал из цикла в конце таблицы и, на последнем FETCH-е сервер сказал: "А нету строк-то, ошибка, :)"
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048902
vadim_march
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему, я до сих пор не догадываюсь
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048904
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикольно. Путаете, небось, что-нибудь. Ошибка была "плавающей" или стабильной? Можете выложить целиком код, который к ней приводил? Как-то с трудом в сказки верится :-)
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048906
vadim_march
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скопировал целиком:
Код: 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.
DECLARE curs cursor
local
forward_only dynamic read_only
for select  og.gd_id
           ,d.dir_id
           ,isnull(d.dir_par_id,  0 ) as dir_par_id
           ,d.dir_name
 --into #temp
 

from ordgd as og
     left join link as l on (l.gd_id = og.gd_id)
     left join dir as d on (l.dir_id = d.dir_id)
where og.order_id = @order_id
     and (d.dir_lock = 'group1'
          or d.dir_par_id is null) 

open curs
while (@count<> 0 )begin
  fetch NEXT from curs into @gd_id, @dir_id, @parent, @name
  set @stri = ''
  while (@parent<> 0 )begin
    set @stri = '\'+ ltrim(rtrim(@name)) + @stri
    set @name = (select dir_name 
                 from dir 
                 where dir_id = @parent
                       and dir_lock = 'group1'
                 )
    set @parent = (select dir_par_id 
                 from dir 
                 where dir_id = @parent
                       and dir_lock = 'group1'
                 )
  end
  if len(@stri)> 254  begin set @stri = 'error'end
  insert into #temp 
  values (@gd_id, @stri)
  set @count = @count -  1 
end

close curs
deallocate curs


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
вместо
while (@count<> 0 )begin
...

было
 FETCH NEXT FROM curs into @gd_id, @dir_id, @parent, @name
WHILE @@FETCH_STATUS =  0 
BEGIN
   FETCH NEXT FROM curs into @gd_id, @dir_id, @parent, @name
...
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048908
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В цикле fetch next должен стоять В КОНЦЕ. А по вашему коду выходит, что делался первый fetch перед циклом (нормально), потом СРАЗУ ЖЕ второй в начале цикла. Ну фигня и получалась. Особенно, когда после последней строки вы пытались взять значения из курсора.
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048910
vadim_march
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
после begin я забыл троеточие
но даже если и так, то что случится с @@FETCH_STATUS
пока я доберусь до конца цикла
почему FETCH только в конце?
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048912
Jose Cuervo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2GreenSunrise
Проверьте, пожалуйста, свой mailbox. Я изложил свои мысли в письме на Ваш адрес. К сожалению, я плохо разбираюсь в курсорах и не стал выносить свои предложения на всеобщее обозрение. Тем не менее, мне бы очень хотелось узнать Ваше мнение до воскресенья.
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048913
vadim_march
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моем представлении @@FETCH_STATUS должен сообщать о состоянии курсора после ПОСЛЕДНЕГО FETCHа в любой момент когда я у него спрашиваю.
Ведь за один цикл ОДИН РАЗ выполняется команда
if @@FETCH_STATUS = 0 ... т.е. while @@FETCH_STATUS = 0
и один же раз
fetch NEXT from curs into @gd_id, @dir_id, @parent, @name
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048914
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да со статусом ничего не случится! Случится с вашей текущей записью. Делая fetch, вы получаете очередную строку. Если достигнут конец курсора, то вы получите лажу. И бодро попытаетесь ее обработать. Ведь не сам fetch в момент своего вызова выбрасывает вас из цикла, правильно? А лишь последующая проверка его статуса.
...
Рейтинг: 0 / 0
Помогите с курсором
    #32048917
vadim_march
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верно :)
БОЛЬШОЕ СПАСИБО
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с курсором
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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