14 Nisan 2011 Perşembe

SQL Stored Procedure Kavramı

Stored Procedure’ler (SP) ; herhangi bir TSQL ifadesini, bir iş parçacığı olarak veri tabanında saklama fırsatı veren nesnelerdir. Parametre alabilirler ve geriye integer değer döndürürler. Amaç; bir işi gerçekleştirmektir, dolayısı ile geriye sorgular içerisinde kullanbilecek değerler dönmezler, sadece EXECUTE edebiliriz (Select * from ‘SP_Adı’ WHERE … şeklinde kullanamayız.). Yapmak istediğimiz işi SP haline getirerek performans artırımı sağlarız. Çünkü SP’ler derlenmiş ifadelerdir, yani birer veri tabanı nesnesidir ve doğrudan sunucu makine üzerinde çalışırlar. Bu sayede istemci tarafındaki yük hafiflemiş olur.

Şimdi de nasıl yazıldıkları hakkında örnek üzerinde inceleme yapalım. AdventureWorks veri tabanında, Bölgelere göre satış tutarlarını gösteren bir select ifadesini Stored Procedure olarak yazalım.

CREATE PROC USERSP_BolgelereGoreSatis

AS   

      SELECT SST.Name[Bölge Adı], SUM(SOD.LineTotal) [Toplam Satış] FROM Sales.SalesOrderDetail SOD

      JOIN Sales.SalesOrderHeader SOH ON SOD.SalesOrderID=SOH.SalesOrderID

      JOIN Sales.SalesTerritory SST ON SST.TerritoryID=SOH.TerritoryID

      GROUP BY SST.Name

Bu haliyle SP’yi başarılı olarak derledik. Şimdi de çalştırıp sonucu görelim.

EXEC USERSP_BolgelereGoreSatis

--EXECUTE USERSP_BolgelereGoreSatis --yukarıdaki satır ile aynı

Untitled

Burada ufak bir detaydan bahsetmekte fayda var. Girişte tanımlama yaparken SP’lerin integer değer döndürdüğünü ifade etmiştik. Şimdi de bunu görelim.

DECLARE @SONUC INT     

EXEC @SONUC= USERSP_BolgelereGoreSatis

PRINT @SONUC

Geriye dönen sonucu ‘Messages’ kısmında görebiliriz.

Untitled2

Eğer SP başarılı olarak Execute edilmişse geriye ‘0’ döndürür. Yukarıda da gördüğümüz gibi istediğimiz sonucu aldık ve geri dönen değerin ‘0’ olduğunu gördük.

Şimdi de parametre alan bir SP yazalım. Amacımız, parametre olarak alt kategori id’si alan ve o alt kategoriye ait ürünleri elde etmemizi sağlayan bir SP yazmak olacak.

CREATE PROC USERSP_ProductBySubCat

@SubCategoryID INT

AS

      SELECT * FROM Production.Product

      WHERE ProductSubcategoryID=@SubCategoryID

SP’lere parametreleri parantez içerisinde vermeyiz direkt olarak virgüllerle veririz.

EXEC USERSP_ProductBySubCat 2

 

Alacağımız sonuç aşağıdaki gibidir.

 

Untitled3

Şimdi de Personel adında bir tablo yapalım ve bu tabloya insert yapabileceğimiz bir SP yazalım.

CREATE TABLE Personel

(

      PersonelID INT PRIMARY KEY IDENTITY(1,1),

      AdSoyad VARCHAR(50),

      Departman VARCHAR(50),

      Maas MONEY

)

CREATE PROC USERSP_InsertPersonel

@adSoyad VARCHAR(50),

@departman VARCHAR(50),

@maas MONEY

AS

      INSERT INTO Personel VALUES(@adSoyad,@departman,@maas)

Şimdi de bu SP üzerinden insert işlemi gerçekleştirelim.

EXEC USERSP_InsertPersonel 'Ali Deneme','Bilgi İşlem',2500

EXEC USERSP_InsertPersonel 'Veli Deneme','IT',4000

Parametrelerin yerini değiştirmek istersek, parametre adlarını da belirtmemiz gerekir.

EXEC USERSP_InsertPersonel @maas=2000,@adSoyad='Ayse Deneme',@departman='İnsan Kaynakları'

İlk 2 örnekteki SP’ler içerisinde Select ifadeleri sakladık. Bu örnekler View veya Table-Valued Function olarak da yazılabilirdi.

Sakladığımız Select ifadesi için;

  1. Eğer sorgu sonuçları başka bir sorguda kullanılmıyorsa SP olarak yazabiliriz.
  2. Eğer sorgu sonuçları başka bir sorguda kullanılıyor ve parametre almıyorsa View olarak yazabiliriz.
  3. Eğer sorgu sonuçları başka bir sorguda kullanılıyor ve parametre alıyorsa table-valued Function olarak yazabiliriz.



0 yorum:

Yorum Gönder