Вниз
Скачать: CL | DM;

Как работают курсоры?   Найти похожие ветки 

← →
Ega23 ©   (2005-11-15 17:10) [0]

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

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


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


← →
Ega23 ©   (2005-11-15 17:10) [1]

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

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

(3 row(s) affected)



← →
ANB ©   (2005-11-15 17:16) [2]


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

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


← →
Ega23 ©   (2005-11-15 17:19) [3]


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


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


← →
ANB ©   (2005-11-15 17:24) [4]


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

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


← →
Nikolay M. ©   (2005-11-15 17:26) [5]

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


← →
ANB ©   (2005-11-15 17:26) [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


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


← →
Ega23 ©   (2005-11-15 17:28) [7]


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


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


← →
Nikolay M. ©   (2005-11-15 17:28) [8]


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

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


← →
Ega23 ©   (2005-11-15 17:30) [9]


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


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

(1 row(s) affected)

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


← →
Nikolay M. ©   (2005-11-15 17:31) [10]


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

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.011 c
2-1134993484
skysat
2005-12-19 14:58
2006.01.08
Ошибка


2-1135069152
medved_68
2005-12-20 11:59
2006.01.08
Список оборудования


3-1131960218
Ильичев С.А.
2005-11-14 12:23
2006.01.08
Rows Affected


14-1133896573
@BraIN
2005-12-06 22:16
2006.01.08
Ура! Таки-упал жесткий диск :о)


1-1134038734
Black Fox
2005-12-08 13:45
2006.01.08
Delphi + Open Office




   Наверх