15 Nisan 2011 Cuma

SQL Scalar-valued Functions

Geriye tek bir değer dönen fonksiyonlardır. Daha kolay anlaşılması adına, küçük bir örnek üzerinde inceleme yapalım. AdventureWorks veritabanında, hangi ürününün kaç adet sipariş edildiği bilgisini elde etmek istediğimizi düşünelim. Ürünlerin sipariş bilgileri Sales.SalesOrderDetail tablosunda tutulmaktadır. Yazacağımız fonksiyon parametre olarak ProductID alsın ve geriye integer bir değer dönsün.

CREATE FUNCTION FN_OrderedProduct(@prodID INT)

RETURNS INT

AS

      BEGIN

            DECLARE @SONUC INT

            SELECT @SONUC = SUM(OrderQty) FROM Sales.SalesOrderDetail

            WHERE ProductID=@prodID

           

            RETURN @SONUC

      END

Fonksiyonumuzu çalıştırmak için ,

SELECT dbo.FN_OrderedProduct(776) --ID'si 776 olan ürün için

Yazdığımız fonksiyonu sorgu içerisinde de kullanabiliriz. Production.Product tablosundaki ürün adlarını ve kaç adet sipariş edildiğini gösterelim. Normal şartlarda bu işlemi join ile gerçekleştirebiliriz.

SELECT PP.Name,SUM(SOD.OrderQty) [Sipariş Adedi] FROM Production.Product PP

LEFT JOIN Sales.SalesOrderDetail SOD ON PP.ProductID=SOD.ProductID

GROUP BY PP.Name

Burada left join kullanmamızın sebebi, Production.Product tablosundaki bazı ürünlerin Sales.SalesOrderDetail tablosunda kaydının bulunmamasıdır. Dolayısı ile bu kolonlar null gelmektedir. null gelen kolonlar da diğer tablo ile eşleşememektedir. Eğer inner join yazsaydık tüm ürünleri elde edemezdik. Sadece Sales.SalesOrderDetail tablosunda kaydı olan ürünleri elde edebilirdik.

 

Yukarıdaki join işlemini, Sales.SalesOrderDetail tablsoundaki kayıtlara ulaşmak için gerçekleştirdik. Halbuki bizim yazdığımız fonksiyon zaten productID’ye göre ürünün kaç adet sipariş edildiği bilgisini getiriyordu. Dolayısı ile sorgumuzu şu şekilde de yazabiliriz,

SELECT Name,dbo.FN_OrderedProduct(ProductID) FROM Production.Product

Görüldüğü gibi, yazdığımız fonksiyonu sorgu içerisinde de kullanabildik. Bu 2 sorgunun ekran çıktıları birebir aynıdır.

Untitled

Şimdi de başka bir örnek yapalım. Person.Contact tablosunda kişilere ait iletişim bilgileri tutulmaktadır. Parametre olarak contactID alan ve geriye o kişinin ünvan+ad+soyad olarak tam adını geriye dönen bir fonksiyon yazalım.

CREATE FUNCTION FN_GetFullName(@contactID INT)

RETURNS VARCHAR(255)

AS

      BEGIN

            DECLARE @FULLNAME VARCHAR(255)

            SELECT @FULLNAME = ISNULL(Title,'') + ' ' + FirstName + ' ' + ISNULL(MiddleName,'') + ' ' + LastName FROM Person.Contact

            WHERE ContactID=@contactID

           

            RETURN @FULLNAME

      END

Not: Title ve MiddleName kolonlarından NULL değerler gelebilir. Metinsel ifademizi + operatörü ile bağladığımızdan ötürü, bu değerlerden herhangi birinin NULL gelmesi, tüm datanın null gelmesine sebep olacaktır. Bu yüzden ISNULL fonksiyonunu kullandık.

ContactID’si 13 olan kişinin tam adını göstermek için,

SELECT dbo.FN_GetFullName(13) [FullName]

Untitled2



0 yorum:

Yorum Gönder