08 December 2016

SQL Kullanıcı Tanımlı Fonksiyonlar (User-Defined Functions)

Önceki notlarımda SQL Matematik Fonksiyonlar (veya Kümeleme Fonksiyonları) ve SQL Tarih-Zaman Fonksiyonları yeralıyor. Burada User Defined Function (UDF) yani Kullanıcı Tanımlı Fonksiyonlar’dan bahsedeceğim.

Yerleşik fonksiyonlar dışında bizim de tanımlayabileceğimiz fonksiyonlar vardır. Bunlara Kullanıcı Tanımlı Fonksiyonlar denir. Kullanıcı Tanımlı Fonksiyonlar ilişkisel veritabanı nesnelerindendir.

View, Prosedür ve Fonksiyon Karşılaştırılması:

  • Viewler parametre alamaz, fonksiyonlar parametre alırlar.
  • Select sorgusu içerisinde prosedür kullanılamaz, fonksiyonlar kullanılabilir.
  • Fonksiyonlar da Prosedüreler gibi bir veya daha fazla Transact SQL ifadesi kullanarak tablo döndürebilir.

Fonksiyon oluşturmak için; CREATE FUNCTION,
Bir fonksiyonda değişiklik yapmak için; ALTER FUNCTION,
Mevcut olan bir fonksiyonu silmek için; DROP FUNCTION ifadeleri kullanılır.

Kullanıcı Tanımlı Fonksiyonlar:

  • Scalar UDF: Bu tür fonksiyonlar tek bir değer döndürebilirler.

Bu fonksiyon türünün kullanımı:

CREATE FUNCTION Fonksiyon_adı(Parametreler)
 RETURNS Fonksiyonun_değerinin_tipi
 AS
 BEGIN
 Fonksiyonun işlevini programlayan satırlar
 RETURN Fonksiyonun_değeri
 END
  • Table Value UDF: Kendi içinde ikiye ayrılır.

1- Inline Table Value UDF: Daha çok parametre alan bir VIEW olarak düşünülebilir.

CREATE FUNCTION Fonksiyon_adı(Parametreler)
 RETURNS table
 AS
 RETURN (
 Bir select deyimi )

2-Multi Statement Table Value UDF: View ve Stored Procedure birleşimidir.

CREATE FUNCTION Fonksiyon_adı(Parametreler)
 RETURNS @Tablo_adı TABLE(Tablonun tanımı)
 AS
 BEGIN
 @Tablo_adı isimli tabloyu oluşturan satırlar
 RETURN
 END

Örnek: Fonksiyona urunId verilecek ve bu ürünü alan musterilerin bilgileri döndürülecek.

create function GetCustomerDetails (@productid int)
 returns table
 as
 return select ProductName, c.CustomerID, CompanyName from Products as p
 join [Order Details] as ord
 on p.ProductID=ord.ProductID
 join Orders as o
 on ord.OrderID=o.OrderID
 join Customers as c
 on o.CustomerID=c.CustomerID
 where ord.ProductID=@productid
--test
select * from dbo.GetCustomerDetails(2)

 

Comments

  1. Dilan says:

    Girilen iki parametre arasında rasgele sayı üreten fonksiyonu tanımlayabilirmisiniz?

  2. Çok güzel bir anlatım olmuş emeğinize sağlık.