[T-Sql] Stored Procedure

Merhaba arkadaşlar, Geldik dananın zort dediği yere 😀

Biz programcıların en değer verdiği şey sanırım bizim işimizi yapan metodlardır. Bir sefer yazdığımız metodları belki 10 belki 100 kez kullanmışızdır. Bu da bizi büyük bir yükten kurtarmıştır aslında. Konumuz aslında Stored Procedure ama neden metodlardan girdim derseniz ikisi arasındaki benzerliktir cevabım.

Store Procedure parametre alabilen Executable(select ile çağrılmayan) C# daki metotlara benzeyen bir yapıdır. Yapılacak bir işlemi bir kere programlayıp daha sonra çağırarak kullanılmasını sağlar. View’deki gibi güvenlik ayarları sayesinde kullanıcılar üzerinde kısıtlılık oluşturur. Amacı işlemi  tanımlamak ve çağırarak kullanılmasını sağlamaktır.


Create procedure UrunEkle --prosedürün tanımlandığı kısım
@urunAdi nvarchar(50),--prosedürün parametrelerinin tanımlandığı kısım
@fiyat money,
@stok int
as --prosedürde yaptırmak istediğimiz kısım yani gövde.
if(Exists(select * from Products where ProductName=@urunAdi))
begin
 update Products 
     set UnitsInStock=UnitsInStock+@stok,
         UnitPrice=@fiyat
 where ProductName=@urunAdi
 print 'Ürün bulunduğu için stoğu arttırıldı,fiyatı yenilendi'
end
else
begin
 insert into Products(ProductName,UnitPrice,UnitsInStock)
 values(@urunAdi,@fiyat,@stok)
 print 'Ürün Eklendi'
end

Yukarıdaki prosedürle Products tablosuna veri ekleyeceğiz. Ancak bulunan bir ürün eklenmek istenirse var olan ürünün bilgileri güncellenerek stoktaki miktarının arttırılmasını istiyoruz. Bunun için gelen veriyi if ile kontrol ettiriyoruz.

Aşağıdaki sorgu ile Products tablosuna “Damla Su” adında bir ürün ekliyoruz. Bu ürün daha önce eklenmediği için Ürün Eklendi çıktısı vererek ürünü ekleyecektir.


exec UrunEkle 'Damla Su',0.35,5000

Yukarıdaki sorguyu tekrar çalıştırdığımızda ise “Ürün bulunduğu için stoğu arttırıldı,fiyatı yenilendi” çıktısı vererek var olan Damla Su ürününün stoğunu arttıracaktır.

Select ifadesi ile Ürünleri getirecek olursak Damla Su ürününden 1 tane kayıtlı olduğunu stoğunun ise 10000 olduğunu görürüz. Bu da demek oluyor ki prosedürümüz istediğimiz işi yapmaktadır.


Select * from Products where ProductName='Damla Su'

Şimdi yeni bir prosedür yazalım. Prosedürümüzün adı “SatısYap” olsun. Müşteri firma adi, çalışan adı, soyadı, bir tane de ürün adı verilecek, orders tablosuna yeni satış oluşturacak. Order details tablosuna bu satışa ait ürünün satış bilgisi girilecektir.

Create proc SatisYap
 @musteriAdi nvarchar(50),--parametre tanımları
 @calisanAdi nvarchar(50),
 @calisanSoyadi nvarchar(50),
 @urunAdi nvarchar(50),
 @adedi int
as
 declare @musteriID nchar(5)-- değişken tanımları
 declare @calisanID int
 declare @urunID int
 declare @fiyati money

select 
       @musteriID=cu.CustomerID 
   from Customers as cu 
   where cu.CompanyName = @musteriAdi -- müşteri ID çekilir.

select 
       @calisanID =e.EmployeeID 
   from Employees as e 
   where e.FirstName = @calisanAdi and 
         e.LastName = @calisanSoyadi--Çalışan IDsi çekilir

select
       @urunID = p.ProductID,
       @fiyati=p.UnitPrice 
   from Products as p 
   where p.ProductName = @urunAdi --Ürün IDsi çekilir.

-- Satışlar tablosuna Çekilen veriler eklenir.

insert into 
   Orders(CustomerID,EmployeeID,OrderDate) 
   values(@musteriID,@calisanID,GETDATE())

declare @orderID int

--eklenen verinin ID değerini Scope_IDENTITY metodu ile çekebiliriz.
set @orderID = SCOPE_IDENTITY()

insert into 
   [Order Details](OrderID,ProductID,UnitPrice,Quantity)
   values(@orderID,@urunID,@fiyati,@adedi)

SCOPE_IDENTITY: Bulunduğu procedure de yapılan son eklemeye ait id yi getirir.
@@IDENTITY : Veriitabanında yapılan son kaydın ID sini verir.Aynı anda başka bir ekleme yapılırsa onun ID si dönebilir.

Aşağıdaki şekilde bir satış yaptırdığımızda işlem başarılı bir şekilde gerçekleştirilirse iki satırın etkilendiğini gösteren bir mesaj gelecektir.


exec SatisYap 'Ernst Handel','NANCY','DAVALIO','CHAI',100

Yaratıcılığınızı kullanarak istediğiniz bir metoda yazabilirsiniz. Tek sınır sizsiniz 🙂

Bu yazım da buraya kadar. Procedürlere ilerde bir daha deyinmeye çalışacağım. Bana ayrılan sürenin sonuna geldim 😛 Kendinize iyi bakınız …

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir