Merhabalar,
Bu yazımızda database kullanılan programlarda veya web uygulamalarında oldukça kolaylık sağlayan bir yapı olan Stored Procedurelere bakacağız.Stored Procedure'ler sorguların derlenmiş hali olarak SQL Server'da saklanmasına olanak tanıyan yapılardır.
Bir Stored Procedure "CREATE PROCEDURE" veya daha kısa yöntemi olan "CREATE PROC" ifadeleri ile başlar ve bu ifadeden sonra procedure adı gireriz.Burdada yazılım dünyasında çok yerde standart şekiller kullanıldığından procedure adının başına "Sp_" ifadesini eklemek okunması açısından da kolaylık sağlar.Yani "CREATE PROCEDURE Sp_Listele" gibi.Bağlı bulunduğumuz database'de procedure oluşturabilmemiz için bağlı kullanıcınında bazı yetkileri olması gerekiyor.Bunlardan bazıları Database Owner (db_owner),System Administrator (sysadmin) gibi yetkilere sahip olmalıdır.
Örnek olarak mesela bir SP yazalım ve bu yazdığımız SP'yi çalıştırdığımızda KitapTur tablomuzdaki verileri getirsin bize.
CREATE PROC Sp_KitapTurListele
AS
Begin
SELECT * FROM KitapTur
End
Bu şekilde bir SP oluşturuluyor.Bunu çalıştırabilmek içinde EXEC ifadesi kullanılır ve hemen yanına SP adını gireriz.Yani yazmamız gereken ifade
dir.
Bu SP'yi çalıştırdığımızda KitapTur tablomuzdaki tüm bilgileri getirebiliriz.Bu yazdığımız SP'ler SQL Server'da saklanır demiştik ya işte bunlara bakabilmemiz için oluşturduğumuz veritabanının yanındaki -'ye basıp liste açıldığında "Programmability" nin altında "Stored Procedures"lerin altında yazmış olduğumuz tüm SP leri görebiliriz. Yazmış olduğumuz sorguda mesela iş mantığımızı değiştirip diyoruzki KitapTur tablosundaki 1 numaralı id'deki tur adi gelsin istiyoruz.Bunun için tekrar bir sorgu yazmak yerine CREATE ifadesine ALTER dersek daha önce oluşturduğumuz SP'nin üzerine ALTER ifadesinden sonraki hali uygulanmış olur.Yani,
ALTER PROC Sp_KitapTurListele
AS
Begin
SELECT * FROM KitapTur WHERE id=1
End
Artık bu SP'yi EXEC Sp_KitapTurListele diye çalıştırırsak KitapTur tablosundaki 1 numaralı kayıt gelecektir.
Biz SP'lerimize parametrede verebiliriz.Şöyle diyelim mesela bir SP yazalimki EXEC ifadesi ile çalıştırırken de KitapTur adına girilecek olan tür adını bu ifadeye parametre verelim. SP aşağıdaki gibi olacaktır.
CREATE PROCEDURE Sp_KitapTurEkle
(
@KitapTurAdi varchar(50)
)
AS
Begin
INSERT INTO KitapTur (KitapTurAdi) VALUES (@KitapTurAdi)
End
Bu SP'den biraz bahsedelim.Parametre atayabilmemiz için değişken oluşturmamız gerekiyor ki geçici olarak bilgilerimizi taşıyalım.SQL Server'da @ ifadesi kullanılır değişken oluşturmada var her değişkenin bir türü olacağından burada varchar(50) diyip 50 karakterlik boyut veriyoruz.Karakter ifadelerini ' ' tek tırnak arasında belirtmeliyiz. @KitapTurAdi adındaki değişkenden başka 1'den fazlada değişken oluşturup işlem yaptırabiliriz.Bu yazmış olduğumuzu parametreli SP'yi çalıştırmak için
EXEC Sp_KitapTurEkle 'Siyaset'
dememiz yeterlidir.Bu sorguyu çalıştırdığımızda KitapTur tablomuza Siyaset adında yeni bir kayıt girilmiş olur.
Şimdi başka bir Sp yazalım ve bu oluşturduğumuz sp'ye parametre olarak bir id verelim ve vermiş olduğumuz id değeri kaçsa o id'e göre KitapTur'den tür kayıtı silelim.Yapacağımız işlem ,
CREATE PROC Sp_KitapTurSil
(
@TurID int
)
AS
BEGIN
DELETE FROM KitapTur WHERE id=@TurID
END
dediğimizde vereceğimiz sayı doğrultusunda o kayıtı silecektir.SP'yi çalıştırmak içinde aşağıdaki ifadeyi yazmamız yeterlidir.
Bu EXEC Sp_KitapTurSil 2 ifadesi çalıştığında KitapTur tablosundaki 2 numaralı id'de bulunan kayıt silinmiş olacaktır.
Yazmış olduğumuz tüm sorgularda sonuç olarak etkilenen kayıt sayısı bize gösterilir.NOCOUNT ON ile sorgudan etkilenen kayıt sayısı geriye döndürülmez varsayılan olarak bu ayar OFF olarak bırakılmış durumdadır ve tüm sorgulardan kaç satırın etkilendiği hesaplanıp döndürülür bu da bize performanstan kayıp olarak geri döner. Eğer sorgudan etkilenen kayıt sayısı bizim için önemli değil ise NOCOUNT ON ile bunu iptal edebiliriz.
KitapTurEkle diye bir SP oluşturmuştuk tekrar bir sorgu oluşturmak yerine yazmış olduğumuz ifade de CREATE yerine ALTER diyebiliriz.Ve SET NOCOUNT ON ifadesinide eklediğimizde artık etkilenen kayıt sayısı bize gösterilmez.
ALTER PROCEDURE Sp_KitapTurEkle
(
@KitapTurAdi varchar(50)
)
AS
Begin
SET NOCOUNT ON
INSERT INTO KitapTur (KitapTurAdi) VALUES (@KitapTurAdi)
End
Artık bu SP'mizi
EXEC Sp_KitapTurEkle 'Kişisel Gelişim'
diyerek çalıştırırsak etkilenen kayıt sayısı gösterilmeyecektir.Bu bilgide dipnot olsun :)
SP işlemleri ile bir sorguda ki UPDATE,DELETE,INSERT gibi işlemleri yapabiliriz. Hatta birbiri ile ilişkili tablolarda öyle bir SP yazılabilirki tek bir id verilir ve DB'den o bilgi doğrultusunda kayıt silinebilir :)
Makalenin faydalı olması dileğiyle iyi günler :)
Serhat TAŞ