|
|
![]() |
jemilsezer@yahoo.com |
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.
|
|