Cursor Kullanımı

20 Ara by NURULLAH ÇAKIR

Cursor Kullanımı

SQL Server’da Cursor, bir select sonucunda dönen kayıt kümesi üzerinde teker teker dolaşarak her satır için bir işlem yapmamızı sağlar. Stored Procedure ya da Trigger ile kullanabilirsiniz. Ya da bir job’ın içersinden TSQL kodu şeklinde çalıştırabilirsiniz.

Cursor’ın ne olduğunu ve nasıl kullanacağımızı anlamak için basit bir örnek yapalım.

Bir eğitim kurumunda eğitimini başarı ile tamamlayan öğrencilere tebrik maili göndermek isteyelim. Öğrenci bilgilerimizin tutulduğu tablomuzun create script’i aşağıdaki gibi olsun. Başarı notu 70 ve üstünde olan öğrencilere tebrik maili, başarı notu 70’in altında olan öğrencilerede kursu başarı ile bitiremediklerine dair bilgi maili gönderelim.

SQL Server üzerinden Database Mail ile mail gönderebilmek için Database Mail’i konfigüre etmeniz gerekir. “Database Mail Konfigurasyonu” isimli makalemden faydalanabilirsiniz.

CREATE TABLE [dbo].[Ogrenci](
[Id] [int] IDENTITY(1,1) NOT NULL,
[OgrenciAdi] [varchar](50) NULL,
[OgrenciSoyadi] [varchar](50) NULL,
[OgrenciEmail] [varchar](50) NULL,
[OgrenciNotu] [int] NULL,
 CONSTRAINT [PK_Ogrenci] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

 

Tablomuzu oluşturduktan sonra aşağıdaki script’i kullanarak tablomuza 3 tane kayıt ekleyelim.

INSERT INTO [dbo].[Ogrenci]([OgrenciAdi],[OgrenciSoyadi],[OgrenciEmail],[OgrenciNotu])VALUES('Nurullah','ÇAKIR','destek@veritabani.gen.tr',65)
INSERT INTO [dbo].[Ogrenci]([OgrenciAdi],[OgrenciSoyadi],[OgrenciEmail],[OgrenciNotu])VALUES('FARUK','ERDEM','destek@veritabani.gen.tr',90)
INSERT INTO [dbo].[Ogrenci]([OgrenciAdi],[OgrenciSoyadi],[OgrenciEmail],[OgrenciNotu])VALUES('DİLARA','AYDIN','destek@veritabani.gen.tr',90)

 

Daha sonra aşağıdaki script ile cursor kullanarak Ogrenci tablosundaki kayıtları teker teker dolaşalım ve her kayıda geldiğimizde notunu kontrol ederek 70’in üstündeyse o kişiye tebrik maili, 70’in altındaysa başarısızlık bilgisini ileten bir mail atalım. Kodun içersinde /**/ ifadeleri arasında daha kolay anlaşılması için açıklamalar yazdım.

DECLARE @OgrenciAdi VARCHAR(50)
DECLARE @OgrenciSoyAdi VARCHAR(50)
DECLARE @OgrenciEmail VARCHAR(50)
DECLARE @OgrenciNotu int
DECLARE @HTML  VARCHAR(MAX) ;


/*Cursor'a bir isim veriyoruz*/
DECLARE KursSonuDegerlendirmesi CURSOR
FOR
/*Cursor'ın dolaşacağı kayıt kümesini belirten select cümleceği*/
SELECT [OgrenciAdi],[OgrenciSoyadi],[OgrenciEmail],[OgrenciNotu] FROM [OGR].[dbo].[Ogrenci]
OPEN KursSonuDegerlendirmesi
FETCH NEXT FROM KursSonuDegerlendirmesi INTO @OgrenciAdi,@OgrenciSoyAdi,@OgrenciEmail,@OgrenciNotu
/*WHILE @@FETCH_STATUS=0 Cursorda dolaşacak kayıt kalmayana kadar bir sonraki kayda geçerek cursor'ı döndürmeye devam et demek*/
WHILE @@FETCH_STATUS =0
BEGIN                

/*IF(@OgrenciNotu>=70) ve altındaki BEGIN-END arasındaki kod bloğunda eğer öğrenci notu 70'den büyükse o kişiye tebrik maili atıyoruz*/
IF(@OgrenciNotu>=70)
BEGIN

SET @HTML =
N'<H1>Sayın '+@OgrenciAdi+' '+@OgrenciSoyAdi+',<br></H1>' +
N'Kursumuzu Başarı ile Tamamladınız,<br>' +
N'Tebrikler.<br>'



EXEC msdb.dbo.sp_send_dbmail
@recipients=@OgrenciEmail,
@subject = 'Kurs Başarı Bilgisi',
@body = @HTML,
@body_format = 'HTML' ;
END
/*ELSE ve altındaki BEGIN-END arasındaki kod bloğunda eğer öğrenci notu 70'den küçükse o kişiye başarısızlık maili atıyoruz*/
ELSE

BEGIN

SET @HTML =
N'<H4>Sayın '+@OgrenciAdi+' '+@OgrenciSoyAdi+',<br></H4>' +
N'Kursumuzu Başarı ile Tamamlayamadınız,<br>' +
N'Kursu Tekralamak İçin Bizimle İrtibata Geçebilirsiniz.<br>'


EXEC msdb.dbo.sp_send_dbmail
@recipients=@OgrenciEmail,
@subject = 'Kurs Başarı Bilgisi',
@body = @HTML,
@body_format = 'HTML' ;
END
 FETCH NEXT FROM KursSonuDegerlendirmesi INTO @OgrenciAdi,@OgrenciSoyAdi,@OgrenciEmail,@OgrenciNotu
END                

/*CLOSE ve DEALLOCATE komutlatı ile Cursor'ı kapatıyoruz*/
CLOSE KursSonuDegerlendirmesi
DEALLOCATE KursSonuDegerlendirmesi

 

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir