- Stored Procedureler, bir takım alt yordamların bir araya gelmesiyle oluşturulmuş veritabanı nesneleri olarak düşünülebilir.
- Stored Procedure’ler, sahip oldukları cache mekanizması sayesinde sorguların çalışma sürelerini kısaltabilirler.
- Stored Procedure’ler, çalıştırdıkları sorgulara ait execution planı saklarlar. Bu plan daha sonra kullanılmak üzere Stored Procedure Cache’e atılır.
- Dolayısıyla aynı prosedürü tekrar çalıştırdığımızda, ilk çalışmada meydana gelen ve vakit kaybına sebep olan bir işler tekrar yapılmamış olur.
- Özellikle büyük tablolarda, yapılan rapolarda, hangi indexlerin kullanılması gerektiğiyle ilgili çıkartılan execution plan vakit kaybettirir. Bu planın cache’ten kullanılması performansı çok ciddi bir şekilde arttırabilir.
Örnek Olarak Basit Bir prosedür Tanımlayalım;
Use AdventureWorks2017 CREATE PROC Person.UlkeListesi --Buradaki "Person" Şema adıdır. AS SELECT * FROM Person.CountryRegion exec Person.UlkeListesi
Prosedürler SELECT edilemezler! Sadece EXEC edilebilirler. Procedurümüzü Çalıştıralım;
exec Person.UlkeListesi
Parametrik Stored Procedure
Bir SP parametrik yapılabilir. Output parametreler yapılabilir.
Öncelikle Çalışacağımız Tabloları Oluşturalım;
1-Urun Tablosu
2-Satis Tablosu
CREATE TABLE Urun ( UrunID INT IDENTITY(1,1), Ad NVARCHAR(50), Fiyat MONEY, Stok INT ) CREATE TABLE Satis ( SatisID INT IDENTITY(1,1), UrunID INT, SatisFiyat MONEY, Adet INT, Tarih SMALLDATETIME )
Tablolarımızı Oluşturduk , Biraz Veri Ekleyelim.
insert into Urun(Ad,Fiyat,Stok) values('ACE','2','2') insert into Urun(Ad,Fiyat,Stok) values('OMO','4','1') insert into Urun(Ad,Fiyat,Stok) values('Pril','5','5')
Şimdi yapacağımız prosedürün senaryosunu yazalım.
1- SatisYap isimli bir prosedür yazalım
2- Parametre olarak satılan ürünün id’sini ve adedini alsın.
3- Satis tablosuna yapılan satışı insert etsin.
4- Urun tablosunda satılan ürünün stok miktarını update etsin.
Prosedürümüzü Yazmaya Başlayalım.
create PROC SatisYap(@UrunID INT,@Adet INT) AS BEGIN DECLARE @Fiyat MONEY,@Stok INT SELECT @Fiyat = Fiyat,@Stok = Stok FROM Urun WHERE UrunID=@UrunID IF(@Stok >= @Adet) BEGIN INSERT INTO Satis VALUES(@UrunID,@Fiyat,@Adet,GETDATE()) UPDATE Urun SET Stok = Stok - @Adet WHERE UrunID=@UrunID END ELSE RAISERROR('Ürünün stok miktari yetersiz.',9,1) END
Çalıştıralım Şimdi Prosedürümüzü
BEGIN TRY EXEC SatisYap1,5 END TRY BEGIN CATCH PRINT 'Hata meydana gelmiş' END CATCH
Prosedürümüzü çalıştırdığımızda; Ürünün stok miktari yetersiz. Msg 50000, Level 9, State 1 hatasını almış olmamız gerekiyor. Çünkü 1 Nolu üründen 5 adet stok bulunmamaktadır. eğer parametreleri EXEC SatisYap 1,1 olarak çalıştırdımızda gerekli işlemin başarı olarak sonuçlandığını görüyor olacağız.
Görüşmek üzere..
Related posts
Kategoriler
- ASP.NET (1)
- C# (13)
- SQL İpuçları ve Püf Noktaları (1)
- SQL Server (4)
- Uncategorized (1)