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 …