Sql Server’ Da Cursor Kullanimi

EftelyA

Yaşayan Forum Efsanesi
22 Kas 2007
9,097
59
EsEs
SQL SERVER’ DA CURSOR KULLANIMI



SQL (Structured Query Language) ilişkisel veritabanı yönetiminde kullanılan veri tanımlama, işaretleme ve kontrol dilidir. SQL’in her ne kadar belirlenmiş bir standardı olsa da (SQL-92) ticari yazılımlar bu standarda ek özellikler ve işlevler eklemiştir. T-SQL (Transact SQL) MS SQL SERVER’ın kullandığı SQL dilidir.
Cursor’lar bir veri grubu (tablo) üzerinde satır satır işlem yapabilmeyi sağlar ve birçok veritabanı sistemi tarafından da desteklenir. Cursor tanımlanması ve kullanımına bir göz atalım.
Örnek tablolarımız şu şekilde olsun:
PERSONEL
ID ADI SOYADI YASI
1 YENER ÜNAL 25
2 ALİ FİDAN 30
3 ÖMER TANAÇAN 28

AILE_BILGILER
ID ADI SOYADI YAKINLIK_ID YAKIN_ID
1 METİN ÜNAL 1 1
2 LEYLA ÜNAL 2 1
3 TUNÇ FİDAN 3 2
4 DERYA FİDAN 2 2
5 AHMET FİDAN 1 2
6 DERYA TANAÇAN 1 3


YAKINLIK_DERECELERI
ID ACIKLAMA
1 BABA
2 ANNE
3 KARDES
Cursor’dan önce cursor’dan dönecek değerleri tutacak değişkenleri tanımlayalım:
DECLARE @VAR_ID INT
DECLARE @VAR_ADI VARCHAR(50)

DECLARE CRS_PERSONEL CURSOR FOR
SELECT ID,ADI FROM PERSONEL ORDER BY YASI
PERSONEL tablosundaki verilerin ID ve AD alanlarını alacak cursor’ı tanımladık. Ancak bir cursor’ın belirttiğimiz değerleri yüklemesi için onu açmamız gerekir:
DECLARE @VAR_ID INT
DECLARE @VAR_ADI VARCHAR(50)

DECLARE CRS_PERSONEL CURSOR FOR
SELECT ID,ADI FROM PERSONEL ORDER BY YASI

OPEN CRS_PERSONEL
Artık cursor’ımız satırlar üzerinde dolaşmak için hazır. Ancak cursor’ımız şu anda hiçbir satırın üzerinde değil.
DECLARE @VAR_ID INT
DECLARE @VAR_ADI VARCHAR(50)

DECLARE CRS_PERSONEL CURSOR FOR
SELECT ID,ADI FROM PERSONEL ORDER BY YASI

OPEN CRS_PERSONEL

FETCH NEXT FROM CRS_PERSONEL INTO @ID,@ADI
Artık cursor’ımız verilerimizin ilk sırasında. @ID ve @ADI değişkenlerimiz artık set edildi. Benzer şekilde FETCH FIRST komutu ile ilk satıra dönüp FETCH LAST komutu ile de son satıra gidebiliriz. SQL SERVER en son işletilen FETCH komutunun durumunu @@FETCH_STATUS degişkeninde tutar. FETCH komutu başarılı ise 0, başarısız ise -1, FETCH edilen satır bulanmıyorsa da -2 döner.
DECLARE @VAR_ID INT
DECLARE @VAR_ADI VARCHAR(50)

DECLARE CRS_PERSONEL CURSOR FOR
SELECT ID,ADI FROM PERSONEL ORDER BY YASI

OPEN CRS_PERSONEL

FETCH NEXT FROM CRS_PERSONEL INTO @ID,@ADI

WHILE @@FETCH_STATUS =0
BEGIN
SELECT A.ADI, B.ACIKLAMA FROM AILE_BILGILER A
INNER JOIN YAKINLIK_DERECELERI B ON B.ID = A.YAKINLIK_ID
WHERE A.YAKIN_ID = @ID


FETCH NEXT FROM CRS_PERSONEL INTO @ID,@ADI

END
Böylece satır satır tüm PERSONEL tablosu verilerini dolaşarak ID ve ADI kolonlarını istediğimiz şekilde kullanabiliriz.
Bir cursor’ın işi bittikten sonra onu CLOSE komutu ile kapatırız.
DECLARE @VAR_ID INT
DECLARE @VAR_ADI VARCHAR(50)

DECLARE CRS_PERSONEL CURSOR FOR
SELECT ID,ADI FROM PERSONEL ORDER BY YASI

OPEN CRS_PERSONEL

FETCH NEXT FROM CRS_PERSONEL INTO @ID,@ADI

WHILE @@FETCH_STATUS =0
BEGIN
SELECT A.ADI, B.ACIKLAMA FROM AILE_BILGILER A
INNER JOIN YAKINLIK_DERECELERI B ON B.ID = A.YAKINLIK_ID
WHERE A.YAKIN_ID = @ID


FETCH NEXT FROM CRS_PERSONEL INTO @ID,@ADI

END

CLOSE CRS_PERSONEL

DEALLOCATE CRS_PERSONEL
CLOSE komutu ile cursor’ı kapattığımızda tuttuğu satır temizlense de halen sistem kaynağı kullanmaktadır. Bu kaynakları da DEALLOCATE komutu ile serbest bırakırız.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.