Форум: "Базы";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];
ВнизКак работают курсоры? Найти похожие ветки
← →
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 вся ветка
Форум: "Базы";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c