UDF ler

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

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)

 

1. Tek Değer döndüren UDF

         İ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

 

İç-içe UDF kullanımı

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.

 

 

 

2.Tablo Döndüren UDF

      a.Tek Select ile oluşun UDF (inline functions)

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

)

  • begin end bloğu kullanılmaz
  • sonuç tablo olacağı için select tekselect(100) ifadesi ile çalışmaz, tablo ve view lerde olduğu gibi kullanılır.
  • Bu tür udf ler tablo döndüreceği için dbo kısmını yazmanıza gerek yoktur.
  • Mantıksal sınamalar bu udf türünde kullanılamaz. Mantıksal sınamalar kullanılacaksa Birden fazla sorgudan oluşan udfler kullanılmalıdır
     

 

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

 

b. Birden fazla sorgudan oluşan UDF

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.

 

UDF nin Saklı Yordam’dan üstünlükleri ve eksiklikleri

 

  • UDF ler Select, Where ve Case ile birlikte kullanılabilir. Saklı Yordam lar exec ile çalıştırıldığından bunlarla beraber kullanılamaz.
  • UDF 1023 parametre kabul eder, saklı yordamlar 2100 (ikibinyüz) parametre kabul edebilir.
  • non-deterministic (her defasında farklı değer döndüren fonksiyonlara verile addır) değer döndüren fonksiyonlar udf içinde kullanılamazlar. Örnek Rand
    getdate te sql server 2000 hata verir, sql server 2005 hata vermez
    create function fn1()
    returns datetime
    as
    begin
    return getdate()
    end
    select dbo.fn1()

Ama Rand fonksiyonunda

  • create function fn2()
    returns float
    as
    begin
    return rand()
    end
    zamana bağlı olarak değişen sonuçlar olduğundan rand da hata oluşur. Getdate de bu hata önlenmişter.
  • Udf ler yalnızca bir sonuç veya kayıt kümesi döndürürler. Saklı yordamlar birden çok kayıt kümesi döndürebilirler.
  • UDF içerisinden saklı yordam çağrılamaz. Sadece Gelişmiş Saklı Yordam (Extended Stored Procedure) çağrılabilir.
  • UDF içerisinde geçici tablolar kullanılamaz (# ile başlayan tablolar)
  • SET seçeneği UDF de kullanılamaz. (Set Rowcount 5 gibi)
  • RAISEERROR ve  @@ERROR hata yönetim sistemleri UDF de kullanılamaz. Herhangi bir hata oluştuğunda fonksiyon durur, çalışmaz. Saklı yordamda ise hata kontrolü ile hata oluştuğunda şu kısım çalışsın şeklinde belirtebilirsiniz.
  • UDF ler output parametresi döndüremezler, saklı yordamlar döndürebilirler.
  •  Join işlemlerinde UDF bir tablo gibi kullanılabilir, saklı yordam kullanılamaz.
  • Tablo değişkeni döndürür. Saklı yordamda ise fiziksel olarak tablo oluşturulabilir. Fakat tablo değişkeni döndüremez.
Telefon +90 505 747 42 84
Email info@devedijital.com
Adres
Tacettin Veli Mahallesi Halit Narin Caddesi Bahadır Plaza Kat:11 Daire:41 38230 Deve Dijital Melikgazi/Kayseri/Türkiye