﻿
{"id":13588,"date":"2020-02-23T18:41:41","date_gmt":"2020-02-23T18:41:41","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=13588"},"modified":"2020-02-23T18:41:41","modified_gmt":"2020-02-23T18:41:41","slug":"ms-sql-server-cursor-nedir-neden-ve-nasil-kullanilir","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/ms-sql-server-cursor-nedir-neden-ve-nasil-kullanilir\/","title":{"rendered":"MS SQL Server &#8211; Cursor Nedir? Neden ve Nas\u0131l Kullan\u0131l\u0131r?"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>T-SQL her ne kadar bir veri tan\u0131mlama, i\u015faretleme ve kontrol dili olsada yap\u0131sal olarak bazen var olan konseptin d\u0131\u015f\u0131nda ihtiya\u00e7lar do\u011frultusunda kullanmam\u0131z gerekebilen programlama dilidir. \u00c7ekilen verileri b\u00fct\u00fcnsel ve k\u00fcmesel olarak her t\u00fcrl\u00fc i\u015fleme tabi tutabildi\u011fimiz T-SQL konseptinde e\u011fer ki elde edilen veri k\u00fcmesi i\u00e7erisinde sat\u0131r sat\u0131r i\u015flem yapmam\u0131z gereken bir durum s\u00f6z konusu olursa dilin yetene\u011fi olan while d\u00f6ng\u00fcs\u00fcn\u00fc bir\u015fekilde kullanabiliriz lakin \u00f6zellikle bu i\u015flem i\u00e7in geli\u015ftirilmi\u015f <em>Cursorlar\u0131<\/em> tercih etmemiz daha do\u011fru olacakt\u0131r. O halde gelin Cursor nedir, nas\u0131l kullan\u0131l\u0131r? inceleyelim&#8230;<\/p>\n<h3>Cursor Nedir?<\/h3>\n<p>Cursorlar, veri k\u00fcmesindeki her bir veriyi ad\u0131m ad\u0131m bizlere getiren ve bu \u015fekilde sat\u0131rsal bazda i\u015flem yapmam\u0131z\u0131 sa\u011flayan yap\u0131lard\u0131r. \u00c7al\u0131\u015fma \u015fekilleri varsay\u0131lan olarak ileri do\u011fru olsada ileri ve geri olmak \u00fczere s\u0131ras\u0131yla t\u00fcm sat\u0131rlar\u0131 elde etme usul\u00fcne dayan\u0131r. \u0130leri do\u011fru okuma i\u015flemi yapan Cursorlar geriye do\u011fru okuma i\u015flemi yapanlardan kat be kat h\u0131zl\u0131 \u00e7al\u0131\u015fmaktad\u0131rlar.<\/p>\n<h3>Cursor Neden Kullan\u0131l\u0131r?<\/h3>\n<p>Her yap\u0131n\u0131n bir kullan\u0131m nedeni oldu\u011fu gibi Cursorlar\u0131n kullan\u0131m nedenleride a\u015fa\u011f\u0131daki durumlard\u0131r;<\/p>\n<ul>\n<li>Sorgu neticesinde elde edilen veri k\u00fcmesinde sat\u0131r sat\u0131r gezinerek i\u015flem yapmak<\/li>\n<li>Di\u011fer kullan\u0131c\u0131lar taraf\u0131ndan yap\u0131lan de\u011fi\u015fikliklerin g\u00f6r\u00fcn\u00fcrl\u00fck seviyesini ayarlamak<\/li>\n<\/ul>\n<p>i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>Cursor Kullan\u0131m\u0131<\/h3>\n<p>Bir cursor tan\u0131m\u0131n\u0131 \u00f6rneklendirebilmek i\u00e7in onu belli bir senaryoda kullanarak tan\u0131tmak en do\u011frusudur. Bu sebepten dolay\u0131 Northwind veritaban\u0131nda bulunan &#8220;Personeller&#8221; tablosunda her bir sat\u0131r i\u00e7in yapm\u0131\u015f oldu\u011fumuz a\u015fa\u011f\u0131daki cursor \u00e7al\u0131\u015fma \u00f6rne\u011fini inceleyiniz.<\/p>\n<table>\n<thead>\n<tr>\n<th colspan=\"3\"><em style=\"color:red;font-size:12px;\">&#8216;SELECT * FROM Personeller&#8217;<\/em><br \/><em style=\"font-size:12px;\">sorgusunun \u00e7\u0131kt\u0131s\u0131<\/em><\/th>\n<\/tr>\n<tr>\n<th>Ad\u0131<\/th>\n<th>Soyad\u0131<\/th>\n<th>\u00dcnvan<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Nancy<\/td>\n<td>Davolio<\/td>\n<td>Sales Representative<\/td>\n<\/tr>\n<tr>\n<td>Gen\u00e7ay<\/td>\n<td>Fuller<\/td>\n<td>Vice President, Sales<\/td>\n<\/tr>\n<tr>\n<td>Janet<\/td>\n<td>Leverling<\/td>\n<td>Sales Representative<\/td>\n<\/tr>\n<tr>\n<td>Margaret<\/td>\n<td>Peacock<\/td>\n<td>Sales Representative<\/td>\n<\/tr>\n<tr>\n<td>Steven<\/td>\n<td>Buchanan<\/td>\n<td>Sales Manager<\/td>\n<\/tr>\n<tr>\n<td>Michael<\/td>\n<td>Suyama<\/td>\n<td>Sales Representative<\/td>\n<\/tr>\n<tr>\n<td>Robert<\/td>\n<td>King<\/td>\n<td>Sales Representative<\/td>\n<\/tr>\n<tr>\n<td>Laura<\/td>\n<td>Callahan<\/td>\n<td>Inside Sales Coordinator<\/td>\n<\/tr>\n<tr>\n<td>Anne<\/td>\n<td>Dodsworth<\/td>\n<td>Sales Representative<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nDECLARE @Adi NVARCHAR(MAX), @Soyadi NVARCHAR(MAX), @Unvan NVARCHAR(MAX)\r\n\/\/ Cursor olu\u015fturuluyor.\r\nDECLARE PersonelCursor CURSOR\r\nFOR\t\t\t\t\t\t\t\r\n\/\/ Cursor'un temsil edece\u011fi veri k\u00fcmesini getirecek olan sorguyu belirtiliyoruz.\r\nSELECT Adi, Soyadi, Unvan FROM Personeller\r\n\/\/ Cursor a\u00e7\u0131larak kaynak t\u00fcketimi ba\u015flat\u0131l\u0131yor.\r\nOPEN PersonelCursor\r\n\/\/ S\u0131radaki veri yakalan\u0131yor ve haf\u0131zaya al\u0131n\u0131yor. O anki veri 'PersonelCursor' taraf\u0131ndan temsil ediliyor ve kolon de\u011ferleri ilgili de\u011fi\u015fkenlere s\u0131ral\u0131 bir \u015fekilde atan\u0131yor.\r\nFETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan\r\n\/\/ \u0130\u015flem ba\u015far\u0131l\u0131 ise @@FETCH_STATUS de\u011fi\u015fken de\u011feri '0' ise i\u015flem ba\u015far\u0131l\u0131d\u0131r ve bir sonraki kay\u0131t var demektir.\r\nWHILE @@FETCH_STATUS = 0\r\n\tBEGIN\r\n\t\tPRINT @Adi + ' ' + @Soyadi + ' ' + @Unvan\r\n\t\t-- S\u0131radaki veriye ge\u00e7ilir ve tekrardan cursor \u00fczerinden kolon de\u011ferleri ilgili de\u011fi\u015fkenlere atan\u0131r.\r\n\t\tFETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan\r\n\tEND\r\n\/\/ Cursor kapat\u0131l\u0131yor.\r\nCLOSE PersonelCursor\r\n\/\/ Taraf\u0131m\u0131za ayr\u0131lan haf\u0131zay\u0131 bo\u015falt\u0131yoruz.\r\nDEALLOCATE PersonelCursor\r\n<\/pre>\n<p>Yukar\u0131daki \u00e7al\u0131\u015fmay\u0131 sat\u0131r sat\u0131r izah edersek e\u011fer;<\/p>\n<ul>\n<li><strong><em>3.<\/em><\/strong> sat\u0131rda cursor tan\u0131ml\u0131yoruz. Dikkat ederseniz e\u011fer cursor tan\u0131m\u0131n\u0131n, t-sql&#8217;de ki normal de\u011fi\u015fken tan\u0131mlar\u0131ndan fark\u0131 &#8216;@&#8217; karakterini kullanmamakt\u0131r.<\/li>\n<li><strong><em>4<\/em><\/strong> ile <strong><em>6.<\/em><\/strong> sat\u0131rlarda veri k\u00fcmemizi getirecek olan sorgu tan\u0131mlanmaktad\u0131r.<\/li>\n<li><strong><em>8.<\/em><\/strong> sat\u0131rda ise cursor a\u00e7\u0131larak, aktifle\u015ftiriliyor. Nihayetinde veri okuma i\u015flemi haz\u0131r hale gelmeli ve kaynak t\u00fcketimi ba\u015flat\u0131lmal\u0131d\u0131r.<\/li>\n<li><strong><em>10.<\/em><\/strong> sat\u0131rda ise ilk sat\u0131r ele al\u0131nmakta ve kolon de\u011ferleri s\u0131ras\u0131yla de\u011fi\u015fkenlere atanmaktad\u0131r.<\/li>\n<li><strong><em>12.<\/em><\/strong> sat\u0131rda bulunan &#8216;<em>@@FETCH_STATUS<\/em>&#8216; global de\u011fi\u015fkeni her yeni sat\u0131r getirildi\u011finde(FETCH) g\u00fcncellenir ve bize a\u015fa\u011f\u0131daki d\u00f6rt farkl\u0131 de\u011fer ile durum bildirir;<br \/>\n<table>\n<tr>\n<td style=\"text-align:left;\"><strong style=\"color:red;\"><em>0&nbsp;<\/em><\/strong><\/td>\n<td style=\"text-align:left;\">FETCH ba\u015far\u0131l\u0131d\u0131r. Sonraki kay\u0131t vard\u0131r.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong style=\"color:red;\"><em>-1<\/em><\/strong><\/td>\n<td style=\"text-align:left;\">Kay\u0131t bulunamad\u0131.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong style=\"color:red;\"><em>-2<\/em><\/strong><\/td>\n<td style=\"text-align:left;\">\u0130lk kayd\u0131n \u00f6ncesi yahut son kayd\u0131n \u00f6tesinde olundu\u011funu ifade eder. Eksik sat\u0131r hatas\u0131d\u0131r.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong style=\"color:red;\"><em>-9<\/em><\/strong><\/td>\n<td style=\"text-align:left;\">Kay\u0131t getirilemiyor yahut elde edilemiyor.<\/td>\n<\/tr>\n<\/table>\n<p>Bizlerde bildirilen bu durumlara g\u00f6re cursor&#8217;\u0131 ileri ya da geri hareket ettirerek sat\u0131rlar aras\u0131nda dola\u015f\u0131r\u0131z.\n<\/li>\n<li><strong><em>16.<\/em><\/strong> sat\u0131rda ise <strong><em>8.<\/em><\/strong> sat\u0131rda oldu\u011fu gibi veri k\u00fcmesindeki bir sonraki sat\u0131ra ge\u00e7iliyor.<\/li>\n<li><strong><em>19.<\/em><\/strong> sat\u0131rda ise a\u00e7\u0131lan cursor kapat\u0131lmaktad\u0131r. Cursor kapat\u0131lmad\u0131\u011f\u0131 taktirde gereksiz yere sistem kayna\u011f\u0131ndan bir t\u00fcketim yapaca\u011f\u0131ndan dolay\u0131 kullan\u0131ld\u0131\u011f\u0131 noktalarda olas\u0131 hatalar al\u0131nabilir. <\/li>\n<li><strong><em>21.<\/em><\/strong> sat\u0131rda ise haf\u0131zada cursor&#8217;a ayr\u0131lan belle\u011fi bo\u015falt\u0131yoruz. Bu i\u015flemi CLOSE komutu sa\u011flamad\u0131\u011f\u0131ndan dolay\u0131 DEALLOCATE komutuyla ger\u00e7ekle\u015ftiriyoruz.<\/li>\n<\/ul>\n<p>Cursor&#8217;\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki sonucu almaktay\u0131z;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r..png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r..png\" alt=\"MS SQL Server - Cursor Nedir Neden ve Nas\u0131l Kullan\u0131l\u0131r.\" width=\"299\" height=\"157\" class=\"aligncenter size-full wp-image-13620\" \/><\/a><\/p>\n<h3>Cursor Kayd\u0131rma Komutlar\u0131<\/h3>\n<p>Cursor varsay\u0131lan olarak sadece ileriye do\u011fru hareket eden bir y\u00f6nteme sahiptir. Buna FORWARD_ONLY denmektedir. Yukar\u0131daki \u00f6rnekte her ne kadar yazmasakta esas\u0131nda ilgili cursor a\u015fa\u011f\u0131daki gibi FORWARD_ONLY \u00f6zelli\u011fini ifade edecek \u015fekilde tan\u0131mlanabilir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-1.png\" alt=\"MS SQL Server - Cursor Nedir Neden ve Nas\u0131l Kullan\u0131l\u0131r.\" width=\"499\" height=\"210\" class=\"aligncenter size-full wp-image-13625\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-1.png 499w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-1-300x126.png 300w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><\/a><\/p>\n<p>Ayriyetten bizler cursor&#8217;\u0131 ileri kayd\u0131rd\u0131\u011f\u0131m\u0131z gibi geri de kayd\u0131rabilmekte ve hatta ilk ya da son kayda direkt olarak eri\u015febilmekteyiz. T\u00fcm bu i\u015flemleri a\u015fa\u011f\u0131daki FETCH ile kullanaca\u011f\u0131m\u0131z yan komutlar ile ger\u00e7ekle\u015ftirmekteyiz;<\/p>\n<ul>\n<li><strong>NEXT<\/strong>; bir sonraki kayda\/sat\u0131ra ge\u00e7er.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-2.png\" alt=\"MS SQL Server - Cursor Nedir Neden ve Nas\u0131l Kullan\u0131l\u0131r.\" width=\"500\" height=\"310\" class=\"aligncenter size-full wp-image-13629\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-2.png 500w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-2-300x186.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a>\n<\/li>\n<li><strong>PRIOR<\/strong>; bir \u00f6nceki kayda\/sat\u0131ra ge\u00e7er.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-3.png\" alt=\"MS SQL Server - Cursor Nedir Neden ve Nas\u0131l Kullan\u0131l\u0131r.\" width=\"497\" height=\"319\" class=\"aligncenter size-full wp-image-13631\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-3.png 497w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-3-300x193.png 300w\" sizes=\"auto, (max-width: 497px) 100vw, 497px\" \/><\/a>\n<\/li>\n<li><strong>FIRST<\/strong>; ilk kayda\/sat\u0131ra ge\u00e7er.\n<\/li>\n<li><strong>LAST<\/strong>; son kayda\/sat\u0131ra ge\u00e7er.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-4.png\" alt=\"v\" width=\"500\" height=\"254\" class=\"aligncenter size-full wp-image-13633\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-4.png 500w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-4-300x152.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a>\n<\/li>\n<\/ul>\n<p>Yukar\u0131daki FECTH yan komutlar\u0131na g\u00f6z atarsan\u0131z e\u011fer hepsinin cursor tan\u0131mlamas\u0131na ek olarak SCROLL ifadesinin yaz\u0131ld\u0131\u011f\u0131na dikkatinizi \u00e7ekerim. <span style=\"font-size:11px;\">(Dikkat! SCROLL, NEXT komutu d\u0131\u015f\u0131ndakilerde zorunludur)<\/span><\/p>\n<p>Di\u011fer FECTH yan komutlar\u0131m\u0131z ise;<\/p>\n<ul>\n<li><strong>RELATIVE<\/strong>; Cursor&#8217;\u0131n bulundu\u011fu kay\u0131ttan belirtilen say\u0131 kadar ileriye ya da geriye do\u011fru ge\u00e7er.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-5.png\" alt=\"MS SQL Server - Cursor Nedir Neden ve Nas\u0131l Kullan\u0131l\u0131r.\" width=\"502\" height=\"252\" class=\"aligncenter size-full wp-image-13648\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-5.png 502w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-5-300x151.png 300w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><\/a>\n<\/li>\n<li><strong>ABSOLUTE<\/strong>; verilen de\u011fer pozitif ise cursor&#8217;\u0131n ba\u015f\u0131ndan, nefatif ise sonundan itibaren de\u011fer kadar ge\u00e7er.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-6.png\" alt=\"MS SQL Server - Cursor Nedir Neden ve Nas\u0131l Kullan\u0131l\u0131r.\" width=\"500\" height=\"261\" class=\"aligncenter size-full wp-image-13650\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-6.png 500w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/MS-SQL-Server-Cursor-Nedir-Neden-ve-Nas\u0131l-Kullan\u0131l\u0131r.-6-300x157.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a>\n<\/li>\n<\/ul>\n<h3>Cursor T\u00fcrleri Nelerdir?<\/h3>\n<p>Cursorlar \u00e7e\u015fitli \u00f6zelliklerine g\u00f6re d\u00f6rt farkl\u0131 t\u00fcre ayr\u0131l\u0131r. \u015eimdi gelin bu farkl\u0131 cursor t\u00fcrlerini detaylar\u0131yla birlikte inceleyelim.<\/p>\n<ul>\n<li>\n<h4 style=\"color:orange;\">Statik Cursorlar<\/h4>\n<p>Static cursorlar, <em>tempdb<\/em> \u00fczerinde ge\u00e7ici tablo olarak tutulan ve hi\u00e7 bir \u015fekilde de\u011fi\u015ftirilemeyen cursorlard\u0131r.<\/p>\n<p><strong>Tan\u0131mlama<\/strong><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nDECLARE @Adi NVARCHAR(MAX), @Soyadi NVARCHAR(MAX), @Unvan NVARCHAR(MAX)\r\nDECLARE PersonelCursor CURSOR\r\nGLOBAL \/\/ Cursor batch d\u0131\u015f\u0131nda da kullan\u0131labilir.\r\nSCROLL \/\/ Geriye do\u011fru kayd\u0131rma yap\u0131labilir.\r\nSTATIC\r\nFOR\r\nSELECT Adi, SoyAdi, Unvan FROM Personeller\r\nOPEN PersonelCursor\r\nFETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan\r\nWHILE @@FETCH_STATUS = 0\r\n\tBEGIN\r\n\t\tPRINT @Adi + ' ' + @Soyadi + ' ' + @Unvan\r\n\t\tFETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan\r\n\tEND\r\nCLOSE PersonelCursor\r\nDEALLOCATE PersonelCursor\r\n<\/pre>\n<p>Bu cursor ge\u00e7ici tablo olaca\u011f\u0131ndan dolay\u0131 fiziksel tablodaki de\u011fi\u015fikleri yakalayamayacakt\u0131r.\n<\/li>\n<li>\n<h4 style=\"color:orange;\">Keyset-Driven Cursorlar<\/h4>\n<p>Keyset-Driven(Anahtar Tak\u0131m\u0131 \u0130le \u00c7al\u0131\u015ft\u0131r\u0131lan) cursorlar, t\u00fcm sat\u0131rlar\u0131 unique olarak tan\u0131mlayan veri k\u00fcmesi sa\u011flamaktad\u0131rlar.<br \/>\n<strong>\u00d6zellikleri<\/strong><\/p>\n<ul>\n<li>Kullan\u0131ld\u0131\u011f\u0131 tablo \u00fczerinde unique index olmas\u0131 gerekmektedir.<\/li>\n<li><em>tempdb<\/em> veritaban\u0131nda veri k\u00fcmesi de\u011fil, sadece anahtar tak\u0131m\u0131 saklan\u0131r.<\/li>\n<li>Keyset-Driven cursorlar olu\u015fturulduklar\u0131 anda bulunan sat\u0131rlardaki de\u011fi\u015fikliklere duyarl\u0131d\u0131rlar. Lakin olu\u015fturulduktan sonra yeni eklenen sat\u0131rlara kar\u015f\u0131 duyarl\u0131 de\u011fildirler.<\/li>\n<\/ul>\n<p><em style=\"font-size:18px;\">&#8216;Peki hocam bu anahtar tak\u0131m\u0131ndan kas\u0131t nedir?&#8217;<\/em> sorunuzu duyar gibiyim&#8230; Bu anahtar tak\u0131m\u0131 ger\u00e7ek veriye ula\u015fmak i\u00e7in kullan\u0131lan yap\u0131lard\u0131r. Yani bir nevi i\u015faretleyicilerdir. FETCH i\u015flemi esnas\u0131nda o anki veriyi\/sat\u0131r\u0131 elde edebilmek i\u00e7in bu anahtar de\u011feri kullan\u0131lmaktad\u0131r.<br \/>\n<strong>Tan\u0131mlama<\/strong><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nDECLARE @Adi NVARCHAR(MAX), @Soyadi NVARCHAR(MAX), @Unvan NVARCHAR(MAX)\r\nDECLARE PersonelCursor CURSOR\r\nGLOBAL\r\nSCROLL\r\nKEYSET\r\nFOR\r\nSELECT Adi, SoyAdi, Unvan FROM Personeller\r\nOPEN PersonelCursor\r\nFETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan\r\nWHILE @@FETCH_STATUS = 0\r\n\tBEGIN\r\n\t\tPRINT @Adi + ' ' + @Soyadi + ' ' + @Unvan\r\n\t\tFETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan\r\n\tEND\r\nCLOSE PersonelCursor\r\nDEALLOCATE PersonelCursor\r\n<\/pre>\n<p>Bu cursor&#8217;\u0131 olu\u015fturduktan sonra yap\u0131lan sat\u0131r ekleme de\u011fi\u015fiklikleri cursor taraf\u0131ndan yakalanmayacakt\u0131r.\n<\/li>\n<li>\n<h4 style=\"color:orange;\">Dinamik Cursorlar<\/h4>\n<p>Dinamic cursorlar olu\u015fturulduktan sonra fiziksel tabloda yap\u0131lan t\u00fcm aktivitelere kar\u015f\u0131 duyarl\u0131 olduklar\u0131ndan dolay\u0131 yap\u0131lan de\u011fi\u015fiklikler direkt olarak cursor&#8217;a da yans\u0131yacakt\u0131r. Tablo temelinde veri duyarl\u0131l\u0131\u011f\u0131na sahip olduklar\u0131ndan dolay\u0131 her FETCH komutu \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda SELECT ifadesini WHERE \u015fart\u0131 ile birlikte tekrar \u00e7al\u0131\u015ft\u0131racak \u015fekilde yeniden olu\u015fmaktad\u0131rlar. Bundan dolay\u0131 tablodaki veri ve s\u00fct\u00fcn geni\u015fli\u011fine g\u00f6re performanslar\u0131nda olas\u0131 olumsuz de\u011fi\u015fimler s\u00f6z konusu olabilmektedir. <\/p>\n<p>Di\u011fer cursor&#8217;lara nazaran fiziksel olan <em>tempdb<\/em> \u00fczerinde \u00e7al\u0131\u015fmaktansa RAM(ge\u00e7ici bellek)de \u00e7al\u0131\u015fmakta ve b\u00f6ylece fiziksel diske nazaran daha h\u0131zl\u0131 i\u015flem g\u00f6rmektedirler. \u0130\u015fte bundan dolay\u0131 \u00f6zellikle k\u00fc\u00e7\u00fck boyutlu verilerde veri duyarl\u0131l\u0131\u011f\u0131yla birlikte performansl\u0131 bir \u00e7al\u0131\u015fma sergilerler.<\/p>\n<p><strong>Tan\u0131mlama<\/strong><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nDECLARE @Adi NVARCHAR(MAX), @Soyadi NVARCHAR(MAX), @Unvan NVARCHAR(MAX)\r\nDECLARE PersonelCursor CURSOR\r\nDYNAMIC \/\/Cursor'a dinamik \u00f6zellik kazand\u0131r\u0131yoruz.\r\nSCROLL\r\nGLOBAL\r\nFOR\r\nSELECT Adi, SoyAdi, Unvan FROM Personeller\r\nOPEN PersonelCursor\r\nFETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan\r\nWHILE @@FETCH_STATUS = 0\r\n\tBEGIN\r\n\t\tPRINT @Adi + ' ' + @Soyadi + ' ' + @Unvan\r\n\t\tFETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan\r\n\tEND\r\nCLOSE PersonelCursor\r\nDEALLOCATE PersonelCursor\r\n<\/pre>\n<\/li>\n<\/ul>\n<h4>Cursor&#8217;da S\u00fctun G\u00fcncelleme(FOR UPDATE)<\/h4>\n<p>Ana tabloda cursor i\u00e7erisinde kullan\u0131lan kolonlardan herhangi birinde bir g\u00fcncelleme s\u00f6z konusu olursa e\u011fer bunu FOR UPDATE ile belirterek a\u015fa\u011f\u0131daki gibi g\u00fcncellemeyi ilgili cursor&#8217;a yans\u0131tabilmekteyiz.<\/p>\n<p>Burada sadece belirtilen s\u00fctunlar\u0131n g\u00fcncellenece\u011fine dikkatinizi \u00e7ekerim. Aksi taktirde belirtilmeyen kolonlar read only olacak ve herhangi bir m\u00fcdahale edildi\u011finde hata ile kar\u015f\u0131la\u015f\u0131lacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nDECLARE @Adi NVARCHAR(MAX), @Soyadi NVARCHAR(MAX), @Unvan NVARCHAR(MAX)\r\nDECLARE PersonelCursor CURSOR\r\nFOR\r\nSELECT Adi, SoyAdi, Unvan FROM Personeller\r\nFOR UPDATE OF Adi, Soyadi\r\nOPEN PersonelCursor\r\nFETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan\r\nWHILE @@FETCH_STATUS = 0\r\n\tBEGIN\r\n\t\tUPDATE Personeller SET Adi = 'H\u00fcseyin', SoyAdi = 'Kamburo\u011fullar\u0131' WHERE CURRENT OF PersonelCursor\r\n\t\tPRINT @Adi + ' ' + @Soyadi + ' ' + @Unvan\r\n\t\tFETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan\r\n\tEND\r\nCLOSE PersonelCursor\r\nDEALLOCATE PersonelCursor\r\n<\/pre>\n<p>Vee b\u00f6ylece Transact SQL&#8217;de bizlere manevra kazand\u0131ran m\u00fchim ve kritik olan Cursor yap\u0131lanmas\u0131n\u0131 detayl\u0131ca incelemi\u015f ve irdelemi\u015f bulunmaktay\u0131z.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, T-SQL her ne kadar bir veri tan\u0131mlama, i\u015faretleme ve kontrol dili olsada yap\u0131sal olarak bazen var olan konseptin d\u0131\u015f\u0131nda ihtiya\u00e7lar do\u011frultusunda kullanmam\u0131z gerekebilen programlama dilidir. \u00c7ekilen verileri b\u00fct\u00fcnsel ve k\u00fcmesel olarak her t\u00fcrl\u00fc&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3415,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1082,1412],"tags":[3187,3204,3203,3202,3201,3205,3188,3198,3195,3192,3193,3190,3191,3194,3206,3189,3196,3200,3197,3199],"class_list":["post-13588","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sql-server","category-sql-server-2016","tag-fetch_status","tag-cursor-kaydirma-komutlari","tag-cursor-kullanimi","tag-cursor-neden-kullanilir","tag-cursor-nedir","tag-cursor-turleri-nelerdir","tag-deallocate","tag-dinamik-cursorlar","tag-fecth-absolute","tag-fecth-first","tag-fecth-last","tag-fecth-next","tag-fecth-prior","tag-fecth-relative","tag-for-update","tag-forward_only","tag-keyset-driven-cursorlar","tag-ms-sql-cursor","tag-statik-cursorlar","tag-t-sql-cursor"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13588","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=13588"}],"version-history":[{"count":79,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13588\/revisions"}],"predecessor-version":[{"id":13675,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13588\/revisions\/13675"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3415"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=13588"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=13588"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=13588"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}