08 December 2016

SQL Kaydedilmiş Prosedürler (Stored Procedures)

Prosedür Nedir?

Prosedür, bir işlevi yerine getirmek için yazılan kodların bir paket içerisinde tutulmuş halidir.

View ile Prosedür arasındaki fark

  • View dışarıdan parametre alamaz, prosedür alabilir.
  • View içerisinde sadece sonuç kümesi döndürecek kodlar yazılır.

Prosedür Neden Oluşturulur?

Sıkça yapılan işlemlerin bir defa yazılarak program akışına göre tekrar tekrar kullanılmasını sağlamak amacı ile oluşturulur.

Prosedür Neden Tercih edilir?

  • Performansı arttırır.
  • İlk kez çalıştırıldığında derleme yapılır. Daha sonra çalıştırıldığında derlenmiş hali çalıştırıldığından kod oldukça hızlı çalışır.

Prosedür Nasıl Oluşturulur?

CREATE PROC prosedür_adı
 AS
 T-SQL ifadeleri

Çalıştırmak için:

EXECUTE prosedür_adı

Prosedür üzerinde değişiklik yapmak için ALTER, silmek için DROP komutlarını kullanacağız.

Örnek:

CREATE PROC GetProductCategory
 AS
 SELECT ProductName, CategoryName
 FROM Products as p
 JOIN Categories as c
 ON c.CategoryID = p.CategoryID
execute GetProductCategory

Örnek:

CREATE PROC GetProductById (
 @id int
 )
 AS
 SELECT * FROM Products WHERE ProductID = @id
execute GetProductById 2

Bir Procedure Örneği

Soru: Kayıt eklemeden ilgili tabloya gidip ürün var mı diye kontrol edilecek. Ürün mevcutsa ID’sini geri döndürecek. Ürün mevcut değilse kayıt işlemi gerçekleştirilecek.

create proc InsertProduct
 (
 @productname nvarchar(40),
 @unitprice money,
 @unitsInstock int
 )
 as
 declare @productId int
 if exists (select * from Products where ProductName=@productname)
 begin
 select @productId=ProductID from Products where ProductName=@productname
 print('Eklemek İstediğiniz '+@productname +' adlı ürünün ID''si '+cast(@productID as nvarchar(5)))
 end
 else
 begin
 insert into Products (ProductName,UnitPrice,UnitsInStock) values (@productname,@unitprice,@unitsInstock)
 set @productId=SCOPE_IDENTITY()
 return @productId
 end
exec InsertProduct 'Bilgisayar', 3000, 12

SCOPE_IDENTITY() ile ilgili:

Açılmış olan bağlantıda ve sorgunun çalıştığı scope’ta son üretilen identity’yi döndürür.