KULLANICI TANIMLI FONKSİYONLAR (Devam) Skaler değerli fonksiyon örneği: Parametre müşteri grubu olacak, eğer grubu parametresi değeri NULL olursa tüm müşteri sayısını, NULL değilse verilen gruptaki müşteri sayısını veren bir fonksiyon oluşturunuz. Çözüm: CREATE FUNCTION fnmusterisayisi (@Grubu varchar(10)) RETURNS int BEGIN DECLARE @sayi int IF @Grubu IS NULL SELECT @sayi=count(*) FROM musteri ELSE SELECT @sayi=count(*) FROM musteri WHERE Grubu=@Grubu 1
RETURN @sayi END -- tüm müşteri sayısı SELECT dbo.fnmusterisayisi (NULL) -- A grubundaki müşteri sayısı SELECT dbo.fnmusterisayisi ( A ) -- C grubundaki müşteri sayısı SELECT dbo.fnmusterisayisi ( C ) TABLO DÖNDÜREN FONKSİYONLAR Bu tip fonksiyonlar viewlere çok benzerler. Bir tek select ifadesi içerir. Bu ifadenin sonucunu gösterir. View den farklı olarak dışarıdan parametre alır. Genel ifade: CREATE FUNCTION fonksiyonadi (varsaparametreler) RETURNS TABLE RETURN Select ifadesi 2
Örnek: Tüm müşterileri listeleyen bir view oluşturunuz. Ve bu view i sorgulayınız. CREATE VIEW vwmusteri SELECT * FROM musteri Sorgulayalım SELECT * FROM vwmusteri Tüm müşterileri listeleyen fonksiyon oluşturunuz ve bu fonksiyonu sorgulayınız. CREATE FUNCTION fnmusteri () RETURNS TABLE RETURN select * from musteri Sorgulayalım. SELECT * FROM dbo.fnmusteri() Tüm müşterileri listeyen stored procedure oluşturunuz. Bu prosedürü çalıştırınız. 3
CREATE PROCEDURE spmusteri SELECT * FROM musteri go Çalıştıralım. EXEC spmusteri Yukarıdaki view, fonksiyon, prosedürden faydalanarak A ve C grubundaki müşterileri ayrı ayrı listeleyiniz. -- vwmusteri viewinden A ve C grubundaki müşteriler SELECT * FROM vwmusteri WHERE Grubu= A SELECT * FROM vwmusteri WHERE Grubu= C -- fnmusteri fonksiyonundan A ve C grubundaki müşteriler 4
SELECT * FROM fnmusteri() WHERE Grubu= A SELECT * FROM fnmusteri() WHERE Grubu= C -- spmusteri prosedüründen A ve C grubundaki müşteriler. spmusteri prosedüründen A ve C grundaki müşteriler sorgulanamaz, listelenemez. Prosedürler select içinde bulunamaz. Yukarıdaki view, fonksiyon ve prosedüre grubu parametresi tanımlayınız ve A ve C grubundaki müşterileri listeleyiniz. -- view e parametre tanımlayalım. View e parametre tanımlanamaz. -- fonksiyona parametre tanımlayalım ALTER FUNCTION fnmusteri (@grubu varchar(10)) RETURNS TABLE 5
RETURN select * from musteri where grubu=@grubu -- A grubundaki müşteriler SELECT * FROM fnmusteri('a') -- C grubundaki müşteriler SELECT * FROM fnmusteri('c') -- prosedüre parametre tanımlayalım. ALTER PROCEDURE spmusteri @grubu varchar(10) SELECT * FROM musteri WHERE grubu=@grubu Bu prosedürden A ve C grubundaki müşteriler EXEC spmusteri A 6
EXEC spmusteri C ÇOKLU İFADE İLE TABLO DÖNDÜREN FONKSİYONLAR Bu türden fonksiyonlar bir öncekine benzer. Farkı dışarıya değer döndüren tablo yapısındaki değişkene fonksiyon içerinde muhtelif defa veri ekleme işlemi yapılabilir. Genel ifade CREATE FUNCTION fonksiyonadi (varsaparametreler) RETURNS @deger TABLE (tablo tanımı) BEGIN Sql deyimleri INSERT INTO @deger selectifadesi INSERT INTO @deger selectifadesi INSERT INTO @deger selectifadesi.. RETURN 7
END Örnek: Personel ve müsteri tablolarını birbirinin devamı olarak birleştiren bir fonksiyon yazınız. Bu fonksiyoda aşağıdaki kolonlar bulunsun Numara Adi Soyadi Tipi Tipi : Musteri ve Personel Çözüm: CREATE FUNCTION fnmusteripesonel() RETURNS @deger TABLE (Numara varchar(10), Adi varchar(20), soyadi varchar(20), Tipi varchar(10)) BEGIN INSERT INTO @deger SELECT SicilNo, Ad, Soyad, PERSONEL from personel 8
INSERT INTO @deger SELECT str(mno),adi,soyadi, MUSTERİ from musteri RETURN END Yukarıdaki fonksiyonu sorgulayalım SELECT * FROM fnmusteripesonel() 9