Sql Server’da Stored Procedure

Herkese merhaba, Sql Server yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda Sql Server ile stored procedure yazmayı anlatacağım. Hadi başlayalım !
Stored procedurelerü dışarıdan parametre alabilen fakat geriye veri döndürmeyen fonksiyonlar olarak tanımlayabiliriz. Geriye veri döndüremezler yani stored procedure sonucunda bir veri oluşmaz fakat output parametreler ile stored procedure dışarısına veri gönderebilirsiniz. Normal Sql komutları öncelikle yorumlanır ve sonrasında çalıştırılır fakat stored procedureler yazıldıkları anda yorumlanıp öyle kaydedildikleri için çok daha hızlı çalışırlar. Kaydedilirler diyorum çünkü bir veritabanında daha önce yazılmış stored procedureleri görebilirsiniz. Sql Server Management Studio ile veritabanını seçtiğinizde Programmability klasörü altındaki Stored Procedures klasöründe o veritabanına ait stored procedureleri görebilirsiniz. Tabiki stored procedurelerin içeriğini görebilir ve hatta değiştirebilirsiniz. Kullanıcı olarak stored procedure yazılabildiği gibi Sql Server’ın kendi stored procedureleri de bulunmaktadır fakat bunların kaynak kodlarını ne yazık ki görememekteyiz. Öncelikle stored procedure yazımının genel kuralını gösterelim;
create procedure procedure_adı @parametre1 veri_tipi1, @parametre2 veri_tipi2, ..., @parametre_n veri_tipi_n as
-- stored procedure içerisinde yapılacaklar
-- stored procedure içerisinde yapılacaklar
-- stored procedure içerisinde yapılacaklar
Burada bulunan procedure_adı kısmına stored procedureye vermek istediğiniz adı, @parametre1, @parametre2 gibi yerlere dışarıdan almak istediğiniz parametreleri, veri_tipi1, veri_tipi2 gibi yerlere ise ilgili parametrik değişkenin veritipini yazmanız gerekmekte. Dışarıdan parametre almak istemiyorsanız parametre alanını yazmanıza gerek yok. Parametrelerde birer değişken olduklarından ve Sql Server’da değişkenlerin başına @ işareti konduğundan burada da ona dikkat etmemiz gerekiyor. Stored procedure içerisinde de istediğiniz Sql komutlarını yazabilir, istediğiniz işlemi yapabilirsiniz. Başta da dediğim gibi herhangi bir veri geri döndürmediklerinden dolayı yapacağımız işlemler bitince stored procedurede bitmiş oluyor. Stored procedureyi kaydetmek için oluşturma komutunu bir kere çalıştırmanız yeterli. Çalıştırdıktan sonra ilk olarak yazdığınız kodun yazım kurallarına uygun olup olmadığına bakılacak ve uygunsa derlenerek belleğe kaydedilecektir.
Örneğin varchar tipte kitapAdi, int tipte sayfaSayisi, varchar tipte yazar sütunları olan kitaplar adında bir tablomuzun olduğunu varsayalım. Şimdi belirttiğim 3 sütunu parametre alarak bu tabloya veri yazan bir stored procedure yazalım.
create procedure yeniKitapKaydet @kitapAdi varchar(100), @sayfaSayisi int, @yazar varchar(100) as
insert into kitaplar(kitapAdi, sayfaSayisi, yazar) values(@kitapAdi, @sayfaSayisi, @yazar);
Evet görüldüğü üzere 3 tane parametre alıp bu parametrelerden aldığı değerleri kitaplar tablosunda sütunlara veri olarak yazan bir stored procedure kodu yazdık. Stored procedure yazdık, peki nasıl kullanacağız derseniz de onun yazım kuralı da şöyle olacaktır;
exec stored_procedure_adı parametre1, parametre2, ..., parametren
Burada verdiğimiz parametre sayısı ile stored procedurenin istediği parametre sayısı aynı olmalı ve her bir parametre veritipine uygun olarak gönderilmelidir. Yani metinsel tipte olan parametrelere gönderilen veriler tek tırnak içerisine alınmalıdır. Örneğin az önce yazmış olduğumuz yeniKitapKaydet adlı stored procedureyi kullanalım;
exec yeniKitapKaydet 'Sefiller', 1700, 'Victor Hugo'
Burada da gördüğünüz üzere @kitapAdi ve @yazar parametreleri varchar olduğundan bu parametrelere gönderdiğimiz verileri de varchar tipe uygun olarak tek tırnak işareti içerisinde gönderdik. Son yazdığımız Sql kodunu çalıştırdığınızda kitaplar tablosuna yeni bir verinin yazıldığını göreceksiniz.
Stored procedure ile geriye veri döndürülemeyeceğini söylemiştim fakat ekrana yazdırma işlemleri yapılabiliyor yani dolaylı yoldan da olsa geriye veri döndürülebiliyor. Bunun için select komutu kullanılmakta. select komutu hem bir değişkene veri atama hem bir tablo içerisinden veri çekme hemde ekrana yazma görevleri gördüğünden select komutunu kullanarak stored procedure içerisinden herhangi bir veriyi ekrana yazdırabiliyorsunuz. Ekrana yazdırılan bir veriyi de C#, Python, NodeJS gibi programlama dillerini kullanarak görebildiğiniz için bu şekilde dolaylı yoldan geriye veri döndürebilirsiniz. Bunun için stored procedure içerisinde select ile ekrana yazdırmak istediğiniz şeyi yazabilirsiniz. Ekrana yazdırma diyorum çünkü bu işlem geriye veri döndürme değil ekrana veri yazdırmadır, yani doğrudan bir geriye veri döndürme işlemi değildir. Örneğin dışarıdan aldığı int tipindeki 2 tane parametreyi toplayıp sonucu ekrana yazdıran bir stored procedure yazalım;
create procedure toplam @sayi1 int, @sayi2 int as
select @sayi1 + @sayi2
Bu stored procedureyi 2 ve 5 sayıları ile çağıralım;
exec toplam 2, 5;
Stored procedure içerisinden veri almanın bir diğer yolu da output parametreler kullanmak. Bunun içinde stored procedure oluştururken parametreyi output olarak işaretlememiz ve bu parametreye veri gönderirken de output parametresi olduğunu belirtmemiz gerekiyor. Stored procedureyi çağırdıktan sonra oluşturduğumuz output değişkeni ekrana yazarak stored procedure içerisinden herhangi bir veriyi alabiliriz. Örneğin az önce toplam fonksiyonuna bir parametre daha ekleyelim ve bu parametre output olsun.
create procedure toplam @sayi1 int, @sayi2 int, @sonuc int output as
select @sonuc = @sayi1 + @sayi2
Parametrelerden birini output olarak işaretledik fakat bu stored procedureyi nasıl çağıracak ve output olarak işaretli değişkene nasıl ulaşacağız derseniz de şöyle olacaktır;
declare @toplamSonucu int
exec toplam 2, 5, @toplamSonucu output
select @toplamSonucu
Görüldüğü üzere stored procedure oluştururken output olarak işaretlediğimiz parametreye veri atarken de atadığımız veriyi output olarak işaretledik. Öncesinde veriye daha sonra ulaşabilmek için bir değişken oluşturduk ve son olarak bu değişkeni ekrana yazdırdık. Son yazdığımız kodu çalıştırdığınızda @toplamSonucu değişkeninin değerinin ekrana yazıldığını göreceksiniz. Ekrana yazıldığı için de sonradan ulaşılabilir olmakta. Yani @toplamSonucu değişkenine bu oturumda kalmak şartıyla istediğimiz yerden ulaşabiliriz.
Stored procedure yazdığımız zaman dikkat etmemiz gereken şey; stored procedureler sadece yazıldıkları veritabanı üzerinde çalışır ve bu veritabanı üzerinden ulaşılabilir. Stored procedure yazmanın bir diğer avantajı da içerisinde başka stored procedureler yada fonksiyonları çağırabilirsiniz. Yani başlangıçta yazdığımız yeniKitapKaydet stored procedure içerisinde toplam stored proceduresini ve hatta diğer yazdığımız stored procedureleri, fonksiyonları ve Sql Server’ın kendi stored procedurelerini ve fonksiyonlarını çağırabiliriz.
Bir stored procedure üzerinde değişiklik yapabiliyoruz, yani içeriğini değiştirebiliriz. Bunun için şöyle bir yapı kullanmamız gerekiyor;
alter procedure procedure_adı @parametre1 veri_tipi1, @parametre2 veri_tipi2, ..., @parametre_n veri_tipi_n as
-- stored procedure içerisinde yapılacaklar
-- stored procedure içerisinde yapılacaklar
-- stored procedure içerisinde yapılacaklar
Bu şekilde yaptığımız bir değişiklik ile artık stored procedurenin önceki hali silinecek ve yeni hali derlenerek belleğe yazılacaktır, artık yeni halini kullanmamız gerekmekte. Sadece içeriğini değil, parametrelerini de değiştirebiliriz. Yani create ile tek farkı create yeni stored procedure oluştururken; alter var olan bir stored procedure üzerinde değişiklik yapılmasını sağlar.
Yazmış olduğumuz bir stored procedureye ihtiyacımız kalmadığında yani silmek istediğimizde ise şöyle bir komut yazmamız gerekmekte;
drop procedure procedure_adı;
Bu komut sonrasında ilgili stored procedure bellekten silinecek ve bir daha ulaşılamaz olacaktır. Dolayısıyla bu stored procedurenin kullanılmadığından emin olduktan sonra silme işlemini yapmanızı tavsiye ediyorum.
Evet Sql Server’da stored procedure işlemleri bu kadardı, tüm Sql Server yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.