Kullanıcı tanımlı fonksiyonlar 1024 e kadar parametre kabul eder. Mantıksal sınamalar (if şartı) yapar ve sonuc olarak veri döndürür. UDF ler view ler gibi kayıt kümesi döndürebilirler, saklı yordamlar gibi parametre kabul eder, mantıksal sınamalar yapılabilir. Öyleyse neden UDF var?
İki tip UDF vardır.
1. Tek Değer döndüren UDF
2. Tablo döndüren UDF
a. Tek Select ile oluşun UDF (inline functions)
b. Birden fazla sorgudan oluşan UDF (multistatement)
İnteger, varchar(n), char(n), money, datetime, bit veri türlerinden tek bir sonuç döndürürler. text, ntext, image, cursor, ve timestamp veri türleri için değer döndürülemez. Oluşturulan fonksiyon birden çok yerde kullanılabilir (saklı yordamlar ya da yığın işlemleri-go ile ayrılan bloklara yığın işlemi adı verilir-gibi).
Örnek: Aşağıda case işlemi ile öğrenci numarası kontrol ediliyor. Numara değerine göre sonuç alanının içeriği belirleniyor.
select adi,soyadi,
case
when numara<150 then 'küçük'
when numara>150 then 'büyük'
else 'eşit'
end as sonuc
from ogrenci
Bu örneği UDF ile yapalım
create function kiyas(@num int) -–parantez içerisinde parametreler belirleniyor
returns varchar(5) -- fonksiyon varchar (5) büyüklüðünde değer döndürecektir.
as
begin
DECLARE @donecekdeger VARCHAR(5) –değişken tanımlanıyor
if @num<150
set @donecekdeger='küçük'
if @num>150
set @donecekdeger='büyük'
if @num=150
set @donecekdeger='eþit'
return @donecekdeger --değer döndürülüyor
end
kiyas isminde fonksiyon oluşturuldu
select adi,soyadi,
dbo.kiyas(numara)
from ogrenci
kiyas fonksiyonu dbo.kiyas şeklinde çağırılmalıdır. Kiyas işlemi birden fazla kez kullanılacaksa fonksiyon oluşturulması daha mantıklıdır.
Örnek. Telefon numarasını biçimlendirmek.
alter function tel(@gelen varchar(15))
returns varchar(20)
as
begin
declare @bicimlitel varchar(20)
if len(@gelen)<10 –-telefon uzunluðu 10 dan küçük ise biçimleme
set @bicimlitel=@gelen
else
set @bicimlitel='('+left(@gelen,3)+') '+substring(@gelen,4,3)+'-'+substring(@gelen,7,2)+'-'+substring(@gelen,9,2)
return @bicimlitel
end
select adi,soyadi,
dbo.kiyas(numara),dbo.tel(telefon)
from ogrenci
Bir UDF içerisinden diğer bir UDF yi çağırma işlemidir.
create function mutlakdeger(@sayi int)
returns int
as
begin
if @sayi<0
set @sayi=@sayi*(-1)
return @sayi
end
create function kubunual (@sayi int)
returns int
as
begin
declare @sonuc int
set @sonuc=dbo.mutlakdeger(@sayi)
return @sonuc*@sonuc*@sonuc
end
select dbo.kubunual(-5)
gönderdiğimiz sayınunmutlak değeri mutlakdeger fonksiyonunda alınıyor dönen sonuç alınıp kendisi ile 3 kez çarpılarak kübü bulunuyor. Bu örnek önce sayıyı pozitife çeviriyor ardından başka bir fonksiyon ile kübü alınıyor.
View lere benzerler. Ama View ler parametre kabul etmezler. Inline function lara parametreli view de denilebilir.
create function tekselect(@kimlik int)
returns table
as
return(
select * from haber where id<@kimlik
)
select * from dbo.tekselect(100)
id si 100 den küçük olanlar fonksiyon vasıtasıyla seçilecek.
select * from dbo.tekselect(100) where id<15
tekselect fonksiyon sonucununda oluşan tablodan id si 15 ten küçük olanlar seçiliyor
Uyarı: inline fonksiyonlarda view. Üretilen tablolarda olduğu gibi top ifadesi kullanılmadan order by kullanılamız,
select * from haber where id<@kimlik order by baslik
ifadesi çalışmaz ama
select top 20 * from haber where id<@kimlik order by baslik
ifadesi top olduğu için çalışır
Bu udf türünde geri döndürülecek tablonun kayıt deseni tanımlanır. Returns ifadesinden sonra alan adları ve alan adlarının veri türleri belirtilir. Mantıksal sınamalar, atamalar , cursor ler (ileride göreceğiz), SELECT, INSERT, UPDATE ve DELETES ifadelerini bu udf türünde kullanabilirsiniz. İnline fonksiyonlar sadece bir select ile sınırlıdır. Bu türde ise sınır yoktur.
create function cokludondur(@kimlik int)
returns @donsun table
( baslik nvarchar(150),
icerik nvarchar(max),
id int
)
as
begin
insert into @donsun select baslik,icerik,id from haber where id<@kimlik
if not exists(select * from @donsun)
insert into @donsun(icerik) values ('Hiçbir kayıt eklenemedi')
return
end
select * from dbo.cokludondur(100)
UDF ler özyineleme işlemini destekler. Bir fonksiyon içinedn başka bir fonksiyonu çağır mıştık. Bu işleme iç-içe udf adı verilir. Eğer fonksiyon başka bir fonksiyonu değil de kendini çağırırsa özyineleme olur. Bir fonksiyon kendini 32 kez çağırabilir.
Ama Rand fonksiyonunda