Курсор у СКЛ Серверу је д атабасе објекат који нам омогућава да преузмемо сваки ред у исто време и манипулишемо његовим подацима . Курсор није ништа друго до показивач на ред. Увек се користи заједно са наредбом СЕЛЕЦТ. Обично је колекција од СКЛ логика која пролази кроз унапред одређени број редова један по један. Једноставна илустрација курсора је када имамо опсежну базу података о радницима и желимо да израчунамо плату сваког радника након одбитка пореза и одсуства.
СКЛ Сервер сврха курсора је да ажурира податке ред по ред, да их промени или изврши прорачуне који нису могући када преузмемо све записе одједном . Такође је корисно за обављање административних задатака као што је прављење резервних копија базе података СКЛ Сервера у секвенцијалном редоследу. Курсори се углавном користе у развојним, ДБА и ЕТЛ процесима.
Овај чланак објашњава све о СКЛ Сервер курсору, као што је животни циклус курсора, зашто и када се курсор користи, како применити курсоре, његова ограничења и како можемо да заменимо курсор.
Животни циклус курсора
Животни циклус курсора можемо описати у пет различитих секција као што следи:
1: Објави курсор
Први корак је да декларишете курсор користећи доњу СКЛ изјаву:
условни оператор у Јави
DECLARE cursor_name CURSOR FOR select_statement;
Курсор можемо декларисати тако што ћемо навести његово име са типом података ЦУРСОР иза кључне речи ДЕЦЛАРЕ. Затим ћемо написати наредбу СЕЛЕЦТ која дефинише излаз за курсор.
2: Отворите курсор
То је други корак у коме отварамо курсор да бисмо сачували податке преузете из скупа резултата. То можемо да урадимо коришћењем следећег СКЛ исказа:
OPEN cursor_name;
3: Дохвати курсор
То је трећи корак у коме се редови могу преузимати један по један или у блоку да би се извршила манипулација подацима као што су операције уметања, ажурирања и брисања на тренутно активном реду у курсору. То можемо да урадимо коришћењем следећег СКЛ исказа:
FETCH NEXT FROM cursor INTO variable_list;
Такође можемо користити @@ФЕТЦХСТАТУС функција у СКЛ Серверу да бисте добили статус најновијег курсора ФЕТЦХ израза који је извршен на курсору. Тхе ФЕТЦХ изјава је била успешна када @@ФЕТЦХСТАТУС даје нулти излаз. Тхе ДОК израз се може користити за преузимање свих записа из курсора. Следећи код то јасније објашњава:
WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cursor_name; END;
4: Затворите курсор
То је четврти корак у којем курсор треба затворити након што завршимо рад са курсором. То можемо да урадимо коришћењем следећег СКЛ исказа:
CLOSE cursor_name;
5: Одвојите курсор
То је пети и последњи корак у коме ћемо избрисати дефиницију курсора и ослободити све системске ресурсе повезане са курсором. То можемо да урадимо коришћењем следећег СКЛ исказа:
DEALLOCATE cursor_name;
Употреба курсора СКЛ Сервера
Знамо да су системи за управљање релационим базама података, укључујући СКЛ Сервер, одлични у руковању подацима на скупу редова који се називају скупови резултата. На пример , имамо сто продуцт_табле који садржи описе производа. Ако желимо да ажурирамо Цена производа, а затим испод ' АЖУРИРАЊЕ' упит ће ажурирати све записе који одговарају услову у ' ГДЕ' клаузула:
UPDATE product_table SET unit_price = 100 WHERE product_id = 105;
Понекад апликација треба да обради редове на једноструки начин, то јест, ред по ред, а не цео скуп резултата одједном. Овај процес можемо урадити коришћењем курсора у СКЛ Серверу. Пре употребе курсора, морамо знати да су курсори веома лоши у перформансама, тако да га увек треба користити само када не постоји опција осим курсора.
Курсор користи исту технику као што ми користимо петље као што су ФОРЕАЦХ, ФОР, ВХИЛЕ, ДО ВХИЛЕ за понављање једног по једног објекта у свим програмским језицима. Дакле, може се изабрати јер примењује исту логику као и процес петље програмског језика.
Типови курсора у СКЛ Серверу
У наставку су наведене различите врсте курсора у СКЛ Сервер-у:
- Статички курсори
- Динамички курсори
- Курсори само напред
- Кеисет Цурсорс
Статички курсори
Скуп резултата који приказује статички курсор је увек исти као када је курсор први пут отворен. Пошто ће статички курсор похранити резултат у темпдб , увек су само за читање . Можемо користити статички курсор да се крећемо напред и назад. За разлику од других курсора, он је спорији и троши више меморије. Као резултат тога, можемо га користити само када је померање неопходно, а други курсори нису прикладни.
Овај курсор приказује редове који су уклоњени из базе података након што је отворена. Статички курсор не представља никакве операције ИНСЕРТ, УПДАТЕ или ДЕЛЕТЕ (осим ако се курсор не затвори и поново отвори).
Динамички курсори
Динамички курсори су супротни статичким курсорима који нам омогућавају да извршимо операције ажурирања, брисања и уметања података док је курсор отворен. То је подразумевано померање . Може да открије све промене направљене у редовима, редоследу и вредностима у скупу резултата, било да се промене дешавају унутар курсора или ван њега. Изван курсора не можемо да видимо ажурирања док се не обаве.
Курсори само напред
То је подразумевани и најбржи тип курсора међу свим курсорима. Зове се курсор само за напред јер креће се само напред кроз скуп резултата . Овај курсор не подржава померање. Може да преузима само редове од почетка до краја скупа резултата. Омогућава нам да извршимо операције уметања, ажурирања и брисања. Овде је ефекат операција уметања, ажурирања и брисања које је извршио корисник, а које утичу на редове у скупу резултата, видљив док се редови преузимају из курсора. Када је ред преузет, не можемо да видимо промене направљене у редовима кроз курсор.
Курзори само за напред су три категоризовани у три типа:
- Форвард_Онли Кеисет
- Форвард_Онли Статиц
- Убрзај
Кеисет Дривен Цурсорс
Ова функција курсора лежи између статичког и динамичког курсора у погледу његове способности да детектује промене. Не може увек да открије промене у чланству и редоследу скупа резултата као статички курсор. Може да открије промене у вредностима редова скупа резултата као динамички курсор. То само може пређите од првог до последњег и последњег у први ред . Редослед и чланство су фиксни кад год се овај курсор отвори.
Њиме управља скуп јединствених идентификатора истих као и кључеви у комплету кључева. Скуп кључева је одређен свим редовима који су квалификовали наредбу СЕЛЕЦТ када је курсор први пут отворен. Такође може да открије све промене у извору података, који подржава операције ажурирања и брисања. Подразумевано се може померати.
Имплементација Примера
Хајде да имплементирамо пример курсора у СКЛ сервер. То можемо учинити тако што ћемо прво направити табелу под називом ' купац ' користећи следећу изјаву:
листе у Јави
CREATE TABLE customer ( id int PRIMARY KEY, c_name nvarchar(45) NOT NULL, email nvarchar(45) NOT NULL, city nvarchar(25) NOT NULL );
Затим ћемо уметнути вредности у табелу. Можемо да извршимо наредбу у наставку да бисмо додали податке у табелу:
INSERT INTO customer (id, c_name, email, city) VALUES (1,'Steffen', '[email protected]', 'Texas'), (2, 'Joseph', '[email protected]', 'Alaska'), (3, 'Peter', '[email protected]', 'California'), (4,'Donald', '[email protected]', 'New York'), (5, 'Kevin', '[email protected]', 'Florida'), (6, 'Marielia', '[email protected]', 'Arizona'), (7,'Antonio', '[email protected]', 'New York'), (8, 'Diego', '[email protected]', 'California');
Податке можемо верификовати извршавањем СЕЛЕЦТ изјава:
SELECT * FROM customer;
Након извршења упита, можемо видети доњи излаз где имамо осам редова у табелу:
Сада ћемо креирати курсор за приказ података о клијентима. Исечци кода у наставку објашњавају све кораке декларације или креирања курсора тако што све заједно:
цхарат у низу
--Declare the variables for holding data. DECLARE @id INT, @c_name NVARCHAR(50), @city NVARCHAR(50) --Declare and set counter. DECLARE @Counter INT SET @Counter = 1 --Declare a cursor DECLARE PrintCustomers CURSOR FOR SELECT id, c_name, city FROM customer --Open cursor OPEN PrintCustomers --Fetch the record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city --LOOP UNTIL RECORDS ARE AVAILABLE. WHILE @@FETCH_STATUS = 0 BEGIN IF @Counter = 1 BEGIN PRINT 'id' + CHAR(9) + 'c_name' + CHAR(9) + CHAR(9) + 'city' PRINT '--------------------------' END --Print the current record PRINT CAST(@id AS NVARCHAR(10)) + CHAR(9) + @c_name + CHAR(9) + CHAR(9) + @city --Increment the counter variable SET @Counter = @Counter + 1 --Fetch the next record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city END --Close the cursor CLOSE PrintCustomers --Deallocate the cursor DEALLOCATE PrintCustomers
Након извршавања курсора, добићемо следећи излаз:
Ограничења курсора СКЛ Сервера
Курсор има нека ограничења тако да га увек треба користити само када не постоји опција осим курсора. Ова ограничења су:
- Курсор троши мрежне ресурсе тако што захтева повратно путовање мреже сваки пут када дохвати запис.
- Курсор је скуп показивача који се налази у меморији, што значи да је потребно нешто меморије коју би други процеси могли да користе на нашој машини.
- Он намеће закључавање дела табеле или целе табеле приликом обраде података.
- Перформансе и брзина курсора су спорије јер ажурирају записе табеле један по ред.
- Курсори су бржи од вхиле петљи, али имају више надметања.
- Број редова и колона унетих у курсор је још један аспект који утиче на брзину курсора. Односи се на то колико времена је потребно да се отвори курсор и изврши наредба за преузимање.
Како да избегнемо курсоре?
Главни задатак курсора је да прелазе табелу ред по ред. Најлакши начин да избегнете курсоре је дат у наставку:
Коришћење СКЛ вхиле петље
Најлакши начин да се избегне употреба курсора је коришћењем вхиле петље која омогућава уметање скупа резултата у привремену табелу.
Кориснички дефинисане функције
Понекад се курсори користе за израчунавање резултујућег скупа редова. То можемо постићи коришћењем кориснички дефинисане функције која испуњава захтеве.
Коришћење спојева
Јоин обрађује само оне колоне које испуњавају наведени услов и тако смањује редове кода који дају брже перформансе од курсора у случају да је потребно обрадити огромне записе.