Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как работают курсоры? [MSSQL]


Ega23 ©   (2005-11-15 17:10:00) 

Есть такой скрипт:

Declare @UID int
Set NoCount On
Create table #Temp (UID int)
Insert into #Temp (UID) Values (1)
Insert into #Temp (UID) Values (2)
Insert into #Temp (UID) Values (3)
Insert into #Temp (UID) Values (4)
Insert into #Temp (UID) Values (5)
Insert into #Temp (UID) Values (6)
Insert into #Temp (UID) Values (7)

Declare Cur Cursor Local Static for
Select UID from #Temp

Open Cur;
While (0=0)
begin
FETCH NEXT from Cur into @UID;
if @@FETCH_STATUS <> 0 BREAK;
if @UID<5 Delete #Temp where UID=@UID
end;

Close Cur;
Deallocate Cur;

Set NoCount Off

Select * from #Temp

Drop table #Temp


Вопрос: а что, план фетча заранее строится???


Nikolay M.   (2005-11-15 17:31:00) [1]


> ANB ©   (15.11.05 17:26) [6]

Для STATIC и KEYSET: 1.
Для DYNAMIC и FAST_FORWARD: 1, 3, 5, 7.
Все логично.


Ega23   (2005-11-15 17:30:00) [2]


> А ответ - запости.


1
2
3
4
5
6
7
UID        
-----------
1

(1 row(s) affected)

Да. Похоже действительно где-то буфер сидит...


Ega23   (2005-11-15 17:28:00) [3]


> А с чего такой вопрос и что такое "план фетча"?


Да вопрос с того, что я не думал, что так можно делать. А оказалось - можно.
Сильно удивился...


Nikolay M.   (2005-11-15 17:28:00) [4]


> как выполнение курсора "в кишках" устроено?

Думаю, описание опций [STATIC | KEYSET | DYNAMIC | FAST_FORWARD] в DECLARE CURSOR - то, что тебе нужно.


Nikolay M.   (2005-11-15 17:26:00) [5]

А с чего такой вопрос и что такое "план фетча"?


ANB   (2005-11-15 17:26:00) [6]


> Ega23 ©   (15.11.05 17:19) [3]

Попробуй выполнить так (в QA) :
Declare @UID int
Set NoCount On
Create table #Temp (UID int)
Insert into #Temp (UID) Values (1)
Insert into #Temp (UID) Values (2)
Insert into #Temp (UID) Values (3)
Insert into #Temp (UID) Values (4)
Insert into #Temp (UID) Values (5)
Insert into #Temp (UID) Values (6)
Insert into #Temp (UID) Values (7)

Declare Cur Cursor Local Static for
Select UID from #Temp

Open Cur;
While (0=0)
begin
FETCH NEXT from Cur into @UID;
if @@FETCH_STATUS <> 0 BREAK;
Delete #Temp where UID=@UID+1
print @UID
end;

Close Cur;
Deallocate Cur;

Set NoCount Off

Select * from #Temp

Drop table #Temp


А ответ - запости.


ANB   (2005-11-15 17:24:00) [7]


> Ega23 ©   (15.11.05 17:19) [3]

Спросил бы по ораклу - я бы тебе подробнее разжевал. Но, думаю, мс скл похоже работает - т.е. хранит где то выборку. Ты же ее можешь не только по живой таблице сделать, а любой комбинации данных, плюс полей напихать расчетных. В оракле есть еще понятие - время жизни выборки. Превысил - выборка уничтожается.


Ega23   (2005-11-15 17:19:00) [8]


> А чего не работает ? Вроде верно все.


Да я вижу, что верно.
Мне другое интересно: как выполнение курсора "в кишках" устроено?
Насколько я понял, сначала выполняется  Select UID from #Temp, результат где-то сохраняется, а потом из него уже фетчатся данные по очереди.
Так?
Или всё-таки он "на живую" по таблице идёт?


ANB   (2005-11-15 17:16:00) [9]


> Ega23 ©   (15.11.05 17:10) [1]

А чего не работает ? Вроде верно все.


Ega23   (2005-11-15 17:10:00) [10]

Забыл. Результат выполнения:

UID        
-----------
5
6
7

(3 row(s) affected)


Наверх

Титульная страница Поиск, карта сайта Написать письмо