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. Çevrimiçi kumarın tüm hayranlarına adanmıştır! En sevdiğiniz Aviator oyununa artık yeni Clean Feed web sitesinden kolayca erişebilirsiniz! Aviator oynayın ve iyi para kazanın!
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