Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.011 c
1-1134031227
DimonNew
2005-12-08 11:40
2006.01.08
Формат даты для "разных стран"


2-1134849282
pathfinder
2005-12-17 22:54
2006.01.08
Проблема с TThread...


2-1134853068
Scripl
2005-12-17 23:57
2006.01.08
Ссылка


3-1131976444
DelphiLexx
2005-11-14 16:54
2006.01.08
Выделить строку в DBGrid


2-1135170658
з. танька
2005-12-21 16:10
2006.01.08
Мешается экспоненциальная запись





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский