Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.08;
Скачать: 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 вся ветка

Текущий архив: 2006.01.08;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.008 c
3-1131016024
Bolek
2005-11-03 14:07
2006.01.08
Динамический запрос


2-1134676315
Чакуока
2005-12-15 22:51
2006.01.08
Переход на Delphi7


3-1131868887
Бобров Илья
2005-11-13 11:01
2006.01.08
Access и SQL оператор limit


2-1135187302
nirvana
2005-12-21 20:48
2006.01.08
КАк сделать ЛОГ??????????


4-1130938577
Piter
2005-11-02 16:36
2006.01.08
Shutdown компьютера.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский