Stored Procedurelere Giriş

02 Nisan 2007 – 01:33

Bu ilk yazımda size SQL server’lardaki stored procedure’lerden bahsedeğim. Stored procedureler SQL serverda saklanan, sql ifadelerini barındıran metotlar gibi düşünülebilir. Veritabanı programlamaya ilk başlayanlar sql ifadelerini kullandıkları programlama dilinde yazarlar(c#, vb,…). bu ilk öğrenim için uygundur ancak gerçek hayattaki projelerde sql ifadeleri stored procedurelerde saklanır. Stored procedurler bir kere derlenirler ama programlama dilindeki SQL ifadeleri program her çalıştığında tekrar derlenir ve bu da bir zaman kaybı demektir. Diğer yandan kullandığımız dilde yazdığımız sql ifadelerinin doğru veya yanlış olduğunu o dil anlayamaz, doğru kabul eder ve derleme aşamasında hata meydana gelmez, ama o satır işletileceği zaman yani run time’da hata verir ve bu da programlama açısından kötü bir durumdur. Stored procedureler SQL server’da yaratıldıktan sonra derlenir ve hatalı olup olmadıkları orada anlaşılabilir.

Şimdi basit bir stored procedure örneği yapalım.

Create procedure deneme
As
Select * from denemetablosu
Go

Bu procedure anlaşılacağı gibi veritabanımızdaki denemetablosu isimli tablodan bütün verileri çeker. Sql cümlesini istediğim kadar kompleks hale getirebilriz. Zaten stored procedurelerin amacı karmaşık sql cümlelerini sqlde saklayıp hep onu kullanmamızdır.
SQL Query Analyzerda bu procedure’ü kullanmamız için sadece

deneme

yazıp run tuşuna basmamız yeterli olacaktır. Böylece denemetablosunda ne kadar veri varsa onları görebiliriz.

Stored procedureler metotlar gibi parametre alabilir ve değer döndürebilirler.
Şimdi onunla ilgili basit bir örnek gösterelim

Create procedure deneme(@deneme_ad nvarchar(50),  @ deneme_soyad  nvarchar(50))
As
Select * from denemetablosu where AD=@deneme_ad and SOYAD =@deneme_soyad
Go

Bu örnek veritabanımızda kayıtlı olan denemetablosu isimli tablonun AD ve SOYAD kolonlarını kontrol ettiriyor ve eğer aradığımız ad ve soyadda kayıtlar varsa onların bütün kolonlarını bize gösteriyor.

Bu procedure’ü kullanmak için de procedure’ün adını yazıp yanına alacağı parametreleri çift tırnak içinde yazmamız ve run tuşuna basmamız yeterli olacaktır.

deneme “Emrah”,”Koçak”

bu satır işletildiği zaman bize ad sütununda Emrah ve soyad sütununda Koçak olan bütün verileri gösterir.
Eğer procedure’ümüz sayısal bir değer alıyorsa (int, decimal gibi) o zaman çift tırnağa gerek yoktur.

Şimdi bir de return değeri ile ilgili biraz bilgi vermek istiyorum. Stored procedureler zaten select komutuyla bize verileri getirirler ama bazen return değerine ihtiyaç duyarız. Mesela veritabanına kayıt yapmak istiyoruz ve kullanıcı adını belirleyici özellik olarak atadık yani her kullanıcı adı birbirinden farklı olmalı. Şimdi böyle bir veritabanına veri girmek istiyoruz ve kayıt işleminin olup olmadığını da bilmek istiyoruz diyelim. Burada stored procedurelerin bir özellğinden daha bahsetmek istiyorum, stored procedurelerde diğer dillerdeki gibi if, else, next,count gibi deyimleri de kullanabiliriz ve değişken tanımlayıp onlara değer atayabiliriz. SQL serverlarda değişkenler hep başlarına “@” ifadesi konularak tanımlanır. Şimdi yukarıda anlattığım gibi bir veritabanı için kayıt procedure’ü yazalım. Tablomuzun adı KAYIT olsun. 3 tane kolonu olsun:
KULLANICI_ADI, AD, SOYAD

Create procedure KAYITYAP(@KADI nvarchar(50),
@AD nvarchar(50),
@SOYAD nvarchar(50))
AS

Declare @kayitkontrol int
Declare @sonuc int
Set @kayitkontrol=select count(*) from KAYIT where KULLANCI_ADI=@KADI

if(@kayitkontrol=0)
Begin
insert into KAYIT(KULLANICI_ADI, AD,SOYAD) values (@KADI,@AD,@SOYAD)
set @sonuc=1
end

else
begin
set @sonuc=0
end

return @sonuc
GO

Yukarıdaki procedure’ün ne yaptığını kısaca anlatayım. Öncelikle dışarıda 3 tane değer alıyor kullanıcı adı, ad ve soyad için. Sonra iki tane değişken tanımlıyoruz. Bu değişkenlerden ilki @kayitkontrol, tipi ise integer. Bu değişkeni veritabanında aynı kullanıcı adında kayıt var mı yok mu onun için kullanıyoruz.
select count(*) from KAYIT where KULLANCI_ADI=@KADI
satırı veritabanındaki KAYIT isimli tabloda KULLANCI_ADI sütununda bizim girdiğimiz değerle aynı olan verilerin sayısını getiriyor.
Eğer veritabanında aynı kullanıcı adıyla kayıt yoksa bu değer 0 olarak döner. Kullandığımız if ifadesiyle de eğer bu değer 0 ise o zaman kayıt yap diyoruz.
Kullandığımız ikinci değişken @sonuc ise return değeri olarak kullanılıyor. Tipini integer olarak atadık. Eğer kayıt işlemi yapılırsa 1 değerini atıyoruz yapılamadıysa 0 değerini atayıp döndürüyoruz ve kullandığımız arayüz programı da bu değeri ”kayıt yapıldı” ya da “yapılamadı” gibi kullanıcı tarafından anlamlı olan cümlelere dönüştürür. Bu işlem tabi ki çok çeşitli şekillerde de yazılabilir, o programcının düşüncesine kalmıştır.

Stored procedurelerde return değeri sadece matematiksel tipler olmalıdır. Mesela yukarıdaki örnek için eğer return değerine “kaydınız başarıyla yapıldı” şeklinde string bir ifade döndürseydik bu ifadeyi arayüz programımızda kullanamazdık. Öyle return değerleri atayıp procedure’ümüzü derlediğimizde hata yazısı göremeyiz ama bu şekilde yapmanın bir anlamı yoktur ve yanlıştır.

Biraz da stored procedureleri düzenlemeden bahsetmek istiyorum. Örneğin kayıtyap procedureümüzü değiştirmek istiyoruz çünkü tablomuza bir sütun daha ekledik, o zaman procedure’ü yaratırken kullandığımız “create” ifadesi yerine “alter” yazmamız yeterli olacaktır. Sonra alacağı değerleri tabloya göre düzenler ve procedurede istediğimiz değişikliği yapabiliriz

Bu yazımda sizlere stored procedureler ile ilgili giriş için bir bilgi vermeye çalıştım. Diğer yazılarımda stored procedurelerin c#ta kullanımını bütün yönleriyle incelemee çalışacağım. Görüşmek üzere…

Emrah KOÇAK
kocakemrah@gmail.com

Bookmark and Share

Post a Comment

Subscribe without commenting