Главная страница
    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.007 c
2-1134862647
Neiroman
2005-12-18 02:37
2006.01.08
Memo и строки


14-1134504557
alex-drob
2005-12-13 23:09
2006.01.08
Как воспользоваться функцией


2-1135240151
Вт
2005-12-22 11:29
2006.01.08
Виртуальный диск в памяти


2-1134841831
Делфёст
2005-12-17 20:50
2006.01.08
Помогите а?


1-1133964987
MetalFan
2005-12-07 17:16
2006.01.08
функция, обратная format





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