Makale Özeti

Transact-SQL (T-SQL) Stored Procedure, Microsoft SQL Server üzerinde barındırılan, T-SQL komutları ile hazırladığınız işlemler bütününün çalıştırılma anında derlenmesi ile size bir sonuç üreten SQL Server bileşenidir. SQL Server üzerinde sadece tablolarımızı barındırmadığımızı biliyoruz. View, trigger, stored procedure,vs özellikleri ile uygulamamıza performans katmak ve uygulama içinde yazdığımız kod satır sayısını azaltarak zamandan tasarruf etmek bize sağladığı diğer yararlardan. "Stored Procedure Neden Kullanılmalı?" gibi bir sorunun cevabını şu şekilde verebiliriz. (Bu aynı zamanda Stored Procedure lerin faydaları başlığınıda alacaktır :) )

Makale

Stored Procedure I

Transact-SQL (T-SQL) Stored Procedure, Microsoft SQL Server üzerinde barındırılan, T-SQL komutları ile hazırladığınız işlemler bütününün çalıştırılma anında derlenmesi ile size bir sonuç üreten SQL Server bileşenidir.

SQL Server üzerinde sadece tablolarımızı barındırmadığımızı biliyoruz. View, trigger, stored procedure,vs özellikleri ile uygulamamıza performans katmak ve uygulama içinde yazdığımız kod satır sayısını azaltarak zamandan tasarruf etmek bize sağladığı diğer yararlardan.

"Stored Procedure Neden Kullanılmalı?" gibi bir sorunun cevabını şu şekilde verebiliriz. (Bu aynı zamanda Stored Procedure lerin faydaları başlığınıda alacaktır :) )

- Çalışma anı planlama sağlar ve tekrar tekrar kullanılabilir
- Query lerinize otomatik parametrelendirme getirir
- Uygulamalar arasında ortak kullanılabilir yapıdadır
- Güvenli data modifikasyonu sağlar
- Network bandwidth inden tasaruuf sağlar (daha az network bandwidth kaynak kullanımı)
- Zamanlanmış görevlere eklenebilir
- Job olarak tanımlanabilir ve schedule edilebilir
- Database objelerine güvenli erişim olanağı tanır

Tüm bu faydalardan bir tanesi bile ilginizi çektiyse bu yazı ve devamındakileri takip etmenizi öneririm. Birazdan verilecek örnekler sıfırdan stored procedure anlatımı kapsamına girmek ile beraber tüm t-sql komutlarının detay açıklamasına yer verilemeyecektir. Genel geçer kurallar dahilinde genel kullanımlı stored procedure örnekleri verilecektir.

Sql Server da yeni bir database yarattığınızda ms sql kullanmanız gerekebilecek tüm tool ları gruplar. Stored Procedure ler de bu gruplar altında yerini almıştır. Yeni bir Stored Procedure yaratmak için önce console root dan "Stored Procedure" tabına geçmeli ve ekranın sağında mouse unuzun sağ tuşuna tıklayarak "New Stored Procedure" menüsünü seçmeniz yeterlidir.



Karşınıza MS SQL Serverın Stored Procedure yazmanız için oluşturduğu editör çıkacaktır. Bu editörün bana göre en büyük faydası "Check Syntax" butonu ile yazdığınız Stored Procedureun syntax ını kontrol edebiliyor olmanızdır.



Bu ekranda "OWNER" alanına kullanacağınız database in yetkili kullanıcı ismini yazmalısınız. Bu lokal bilgisayarlar için genel olarak "dbo" seçilmesi anlamına gelir. "PROCEDURE NAME" kısmına ise klasik tablo adı, değişken adı gibi özel isimlerde uymanız gereken kurallara uymak suretiyle (boşluk bırakılmaması gibi) yazacağınız procedure vereceğiniz ismi yazacaksınız.

Şimdi basit bir procedure yazalım. Bu procedure ü sizin de test edebilmeniz için SQL Server ile beraber gelen Northwind database ini kullanacağım. Yazacağımız stored procedure Customers tablosundaki şehir isimlerini ve bu şehirlerde kayıtlı satıcı sayılarını veren özellikte olacak.

CREATE PROCEDURE [dbo].[test4]
@Country nvarchar(30)=%
AS
SELECT City, COUNT(*) AS NumberOfCustomers
FROM Customers
WHERE Country LIKE @Country
GROUP BY City
GO


Şimdi syntax ı biraz inceleyelim:

- CREATE PROCEDURE [dbo].[test4]
T-SQLin stored procedure yaratmak için bize verdiği "Create Procedure" komutunu kullanarak yeni bir stored procedure yaratmak istediğimizi belirtiyoruz. "dbo" kullanacağımız yetkili kullanıcı adını, "test" ise yaratacağımız Stored Procedure e vereceğimiz ismi belirtiyor.

- @Country nvarchar(30)=%
Country adında bir değişken yaratıyoruz. Değişkenimiz "nvarchar" tipinde ve 30 byte boyutunda. içinde belirttiğimiz değer ise bu değişkene T-SQL içinden atadığımız değişkeni anlatıyor.

- SELECT City, COUNT(*) AS NumberOfCustomers
FROM Customers
WHERE Country LIKE @Country
GROUP BY City
Klasik bir select cümlesi. Tek fark burada where koşulu içinde querystring, session veya formdan gelen bir bilgiyi değil bir stored procedure paramatresini kullandık.

- GO
Stored procedure ün her gerçekleştirmesi gereken işlemden sonra bir önceki komut dizisini çalıştırması için eklediğimiz T-SQL komutu

Bu stored procedure ü herhangi bir desktop program veya web uygulamasından çağırabiliriz ve hatta mobil uygulamalardan. Ancak yazdığımızda hemen ne tür bir veri döndüreceğini test etmek isteyebiliriz. Bu amaçla Sql Server Query Analizer i kullanacağız. Query Analzer da stored procedure leri çalıştırmak için "exec <procedure_adi>" syntax ını kullanıyoruz. Bakalım az önce Northwind database i için yazdığımız Stored Procedure bize nasıl bir veri kümesi geri döndürecek.





Şimdi yeni bir örnek yapalım. Bu sefer konumuz database imizde yeni bir tablo yaratmak olsun.

CREATE PROCEDURE [dbo].[test3]
AS

CREATE TABLE Northwind..TESTTABLO1(k1 int identity, c1 varchar(2))
GO


-CREATE TABLE Northwind..TESTTABLO1(k1 int identity, c1 varchar(2))
"create Table" komutunu kullanarak yeni bir tablo yaratacağımızı belirttik. "NorthWind..TESTTABLO1" sözdizimini kullanmamızın nedeni TESTTABLO1 için NorthWind database ini referans göstermemiz.

Bu procedure müzü çalıştırdığımızda bize bir sonuç yerine bir durum geri döndürecektir. Yani karşımıza grid de listelenebilecek bir veri çıkamayacak sadece "The command(s) completed successfully." O.K. mesajı ile karşılaşacağız. Ve elbette yapmaya çalıştığımız şey yani yeni bir tablo yaratma işlemi olumlu sonuçlanmış olacak.





Şimdi de stored procedure kullanarak "insert" işlemi gerçekleştirelim:

CREATE PROCEDURE [dbo].[test2]
@c1 varchar(50) = ev
AS
Insert Into TESTTABLO1(c1) Values(@c1)
GO


- @c1 varchar(50) = ev
c1 adında varchar(50) tipinde bir değişken tanımladık ve T-SQL kodumuz içinden bu değişkene "ev" değerini atadık

- Insert Into TESTTABLO1(c1) Values(@c1)
Klasik Insert Sql cümlemiz ile TESTTABLO1deki c1 alanına @c1 parametremizi gönderdik. Bu stored procedure ü Query Analizer kullanarak çalıştırdığımızda (exec test2) "(1 row(s) affected)" şeklinde bir mesaj ile karşılaşacağız. Bunun anlamı database imize yeni bir kayıt girmiş olduğumuz.





Bir diğer örneğimiz az önceki eklediğimiz kaydı update etmek ile alakalı olacak. Az önce "ev" değerini girdiğimiz alanı "ve" şekline çevirelim:

CREATE PROCEDURE [dbo].[test1]
@degistir1 varchar(2) = ev,
@degistir2 varchar(2) = ve
AS
UPDATE TESTTABLO1 SET c1 = @degistir2 where c1 = @degistir1
GO


- @degistir1 varchar(2) = ev
Update Sqlimizde kullanacağımız where koşulu için değişkenimizi tanımlıyoruz

- @degistir2 varchar(2) = ve
Yeni bir değişken yaratıp update edeceğimiz veriyi kod içinden tanımlıyoruz

- UPDATE TESTTABLO1 SET c1 = @degistir2 where c1 = @degistir1
Klasik update sql cümlemiz ile c1 alanı @degistir1 olan kayıtları @degistir2 ile update ediyoruz


 

Son olarak az önce insert ve update işlemleri yaptığımız kaydımızı stored procedure kullanarak nasıl sileceğimizi görelim:

CREATE PROCEDURE [dbo].[test4]
@degisken varchar(2) = ve
AS
DELETE FROM TESTTABLO1 where c1 = @degisken
GO


- @degisken varchar(2) = ve
Silme işlemi yapacağımız kayıt için where koşulunu taşıyacak değişkenimizi tanımlıyor ve değer atıyoruz

- DELETE FROM TESTTABLO1 where c1 = @degisken
Klasik delete sql cümlemiz ile c1 alanı @degisken1 olan kayıtları siliyoruz. Bu stored procedure ü çalıştırdığımızda bize grid view şeklinde bir sonuç döndürmeyecektir. Döndüreceği cevap "(1 row(s) affected)" şeklinde olacaktır.


Stored procedure lerde tüm bu işlemleri bizim örneklerde yaptığımız gibi tek tek ayrı stored procedurelerde yaptırmanız gerekmez. Örneğin aynı stored procedure ile tablo yaratabilir, yarattığınız tabloya kayıt girebilir, girdiğiniz kaydı select ettirebilir, update ettirebilir ve ardından silebilirsiniz. İşlemlerin sırayla işlemesi için If...Else... yapıları kullanabilir, her işlemden sonra "GO" komutunu kullanarak işlem kodunun çalışmasını sağlayabilirsiniz.

Örneğin;

CREATE PROCEDURE [dbo].[test6]
@SelectID int = 1
AS
INSERT INTO DEMOTABLO(ISIM, TELEFON) VALUES(EVREN AYAN, 02121234567)
SELECT * FROM DEMOTABLO where ID = @SelectID

If @SelectID = 1
     UPDATE DEMOTABLO SET ISIM = AHMET KARACA, TELEFON = 02127654321 where ID = @SelectID

     DELETE FROM DEMOTABLO where ID = @SelectID

     DROP TABLE NorthWind..DEMOTABLO
GO

gibi.

Bu Stored Procedurede @SelectID adında aslında bizim uygulama içinden göndereceğimiz ama burada demo olması sebebi ile değer atadığımız bir değişken yaratıyoruz.

Daha önce yarattığımız DEMOTABLO ya bir kayıt giriyor hemen ardından bu kaydı sorguluyoruz.

If kontrolünü de görmemiz açısından @SelectIDnin 1 olduğu durumda tablomuzu Update ediyor ve update ettiğimiz kaydı siliyoruz. Son olarak DEMOTABLOyu tamamen siliyor ve işlemimizi bitiriyoruz. Bu örneğin amacı tüm işlemlerinizi tek bir stored procedure içinden yapabileceğinizi göstermektir.

Bir sonraki yazımda hazırladığımız Stored Procedure leri .Net Projelerimizde nasıl kullanacağımızdan bahsedeceğim. Bunu yaparken hem VB.Net hemde C# syntaxını kullanacağız.

Evren AYAN
www.evrenayan.net