Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с курсором / 17 сообщений из 17, страница 1 из 1
06.09.2002, 16:19:02
    #32048877
mick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с курсором
Скажите, если у меня есть несколько сеансов одного пользователя (1С SQL), все они выполняют одну хранимую процедуру в которой используется курсор, то не виден ли он случайно несколькими пользователями одновременно.
Т.е. не видна ли всеми одновременно переменная @@fetch_status?
...
Рейтинг: 0 / 0
06.09.2002, 16:22:20
    #32048879
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с курсором
Курсор глобальный или локальный ?
...
Рейтинг: 0 / 0
06.09.2002, 16:23:39
    #32048881
mick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с курсором
Локальный
...
Рейтинг: 0 / 0
06.09.2002, 16:24:28
    #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
06.09.2002, 17:55:22
    #32048895
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с курсором
vadim_march, а что вы хотели сказать этим циклом, если не секрет?

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

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

я не выпал из цикла в конце таблицы и, на последнем FETCH-е сервер сказал: "А нету строк-то, ошибка, :)"
...
Рейтинг: 0 / 0
06.09.2002, 18:27:32
    #32048902
vadim_march
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с курсором
почему, я до сих пор не догадываюсь
...
Рейтинг: 0 / 0
06.09.2002, 18:34:39
    #32048904
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с курсором
Прикольно. Путаете, небось, что-нибудь. Ошибка была "плавающей" или стабильной? Можете выложить целиком код, который к ней приводил? Как-то с трудом в сказки верится :-)
...
Рейтинг: 0 / 0
06.09.2002, 18:47:18
    #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
06.09.2002, 18:56:13
    #32048908
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с курсором
В цикле fetch next должен стоять В КОНЦЕ. А по вашему коду выходит, что делался первый fetch перед циклом (нормально), потом СРАЗУ ЖЕ второй в начале цикла. Ну фигня и получалась. Особенно, когда после последней строки вы пытались взять значения из курсора.
...
Рейтинг: 0 / 0
06.09.2002, 19:04:31
    #32048910
vadim_march
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с курсором
после begin я забыл троеточие
но даже если и так, то что случится с @@FETCH_STATUS
пока я доберусь до конца цикла
почему FETCH только в конце?
...
Рейтинг: 0 / 0
06.09.2002, 19:10:21
    #32048912
Jose Cuervo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с курсором
2GreenSunrise
Проверьте, пожалуйста, свой mailbox. Я изложил свои мысли в письме на Ваш адрес. К сожалению, я плохо разбираюсь в курсорах и не стал выносить свои предложения на всеобщее обозрение. Тем не менее, мне бы очень хотелось узнать Ваше мнение до воскресенья.
...
Рейтинг: 0 / 0
06.09.2002, 19:13:45
    #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
06.09.2002, 19:18:00
    #32048914
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с курсором
Да со статусом ничего не случится! Случится с вашей текущей записью. Делая fetch, вы получаете очередную строку. Если достигнут конец курсора, то вы получите лажу. И бодро попытаетесь ее обработать. Ведь не сам fetch в момент своего вызова выбрасывает вас из цикла, правильно? А лишь последующая проверка его статуса.
...
Рейтинг: 0 / 0
06.09.2002, 19:26:30
    #32048917
vadim_march
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с курсором
Верно :)
БОЛЬШОЕ СПАСИБО
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с курсором / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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