SQL VE TSQL DERS 27: KULLANICI TANIMLI FONKSİYONLAR

Parametresiz ve Parametreli Skaler Kullanıcı Tanımlı Fonksiyonlar,

Tekli ve Çoklu Tablo Döndüren Kullanıcı Tanımlı Fonksiyonlar,

Kullanıcı Tanımlı Fonksiyonlarda Kod Gizliliği: Şifreleme

Adsız

/*
Kullanıcı tanımlı fonksiyonlar dışarıdan parametre alabilirler, If Else gibi akış kontrol
ifadeleri içerebilirler.  Stored Procedure ve View nesnelerine benzerler. Bir view gibi
select sorgularında kullanılabilir.	Bir view ile parametreli işlem yapamazsınız, ancak
bu KTF ile mümkündür. Bir stored procedure'den alınan sonucu select sorgunuzda etkin olarak
kullanamazsınız ancak KTF ile bu da mümkündür.
KTF'ler viewlerin esneklik ve kullanılabilirliği ile stored procedurelerin parametre
kullanabilme, tampon hafızadan çağrılabilme, parse edilme, derlenme gibi birçok mimari
yeteneklerinin birleşimi olarak düşünülebilir.

KTF'ler 2'ye ayrılırlar.
Skaler Kullanıcı Tanımlı Fonksiyonlar
Tablo Kullanıcı Tanımlı Fonksiyonlar

SKALER KTF

Bir tek değer döndüren fonksiyondur. Birden fazla parametre alabilir, ancak sonuç olarak
tek bir değer döndürür. Örnek: GETDATE() --> O anki sistem zaman bilgisini alarak geriye
sadece bu bilgiyi döndürür.

*/

-- PARAMETRESİZ SKALER FONKSİYON

create function fnc_kitapAdet()
returns int -- geri dönüş veri tipi
as
begin
declare @toplam int
set @toplam = (select Count(kitapId) from kitap)
return @toplam
end

select dbo.kitapAdet() 
-- dbo yazmazsak hata alırız. 
-- kitap tablosundaki kitap sayısını verir bu fonksiyon



-- PARAMETRELİ SKALER FONKSİYON KULLANIMI

create function fnc_kitapFonksiyon(@kitapId int NULL)
returns nvarchar(50)
as
begin
declare @kitapAd nvarchar(50)
set @kitapAd = (select kitap.kitapAd from kitap where kitapId=@kitapId)
return @kitapAd
end 

select dbo.kitapFonksiyon(1)

-- burda ise parametre olarak verdiğimiz Id'ye göre
-- kitap adlarını listeliyoruz.
-- TABLO DÖNDÜREN KTF

/*
Skalerden farkı geriye tek bir değer değil tablo
tipinde değer döndürmesidir.
*/

CREATE function fnc_denemeFonksiyon(@ara nvarchar(50))
returns table
as
return select * from uye where uye.uyeAdSoyad like '%' + @ara + '%'

select * from dbo.denemeFonksiyon('a')

-- @ara parametresi içinde geçen uyeleri listeyen fonksiyonu
-- yazdım. @ara' da 'a' harfi olduğunda içinde a harfi geçen
-- uyeleri listeler
-- ÇOKLU İFADE İLE TABLO DÖNDÜREN FONKSİYONLAR

create function fnc_kitapSayfaFonksiyon(@ilk int,@son int)
returns @values table
(
kitapAd nvarchar(50),
kitapSayfa int
)
as
begin
insert @values
select kitapAd,kitapSayfa from kitap where kitapSayfa>@ilk and kitapSayfa<@son
return
end

select * from dbo.kitapSayfaFonksiyon(100,200)
-- kitap sayfa sayısı 100-200 arası olan kitapları ve tam sayfa sayısı
listeleyen fonksiyon
-- Kullanıcı Tanımlı Fonksiyon Şifrelemek

alter function fnc_kitapFonksiyon(@kitapId int NULL)
returns nvarchar(50)
with encryption -- bu satırla şifreliyoruz.
as
begin
declare @kitapAd nvarchar(50)
set @kitapAd = (select kitap.kitapAd from kitap where kitapId=@kitapId)
return @kitapAd
end 
-- yukarda daha önce yazdığım parametreli skaler fonksiyon
-- örneğini tekrar yazdım ve şifreledim. 

exec sp_helptext 'dbo.kitapFonksiyon' 
-- bu satırı normalde çalıştırdığımızda fonksiyonun
-- içinde kodlara erişebiliriz ancak şifrelendiğinden
-- hata mesajı yazar.

-- Ayrıca alter ile fonksiyonları düzenleyebilir
-- drop ile fonksiyonları silebiliriz.