SQL Server içersinde SUM, COUNT, AVG gibi standart tanımlı hazır fonksiyonlar vardır. Bu fonksiyonlar dışında kullanıcılar kendi ihtiyaçları doğrultusunda fonksiyonlar yazabilirler. Farklı fonksiyon türleri vardır. Bunları inceleyelim.
Geriye Tek Değer Döndüren(Scalar Values) Fonksiyonlar
Geriye tek değer döndüren fonksiyonlara örnek olarak GETDATE() fonksiyonu verebiliriz. Geriye sadece tarih bilgisini döndürür.
1 2 3 4 5 6 7 8 9 10 11 |
CREATE FUNCTION FONKSIYON_ISMI ([{@PARAMETRE VIRI_TIPI} [=DEFAULT] [READONLY]}] ) RETURNS SCALAR_VERI_TIPI [WITH SECENEKLER] AS BEGIN FONKSIYONUN GERCEKLESTIRECEGI ISLEMLER RETURN SCALAR_DEGER END |
FONKSIYON_ISMI: Oluşturulacak fonksiyonun ismini belirtir. Aynı isme sahip ikinci fonksiyon olamaz.
@PARAMETRE: Fonksiyona dışarıdan gelecek değerleri belirler. @ işareti ile başlamak zorundadır.
VERI_TIPI: Parametreler için kullanılacak veri tipini belirler
DEFAULT: Parametreler için kullanılacak varsayılan değerlerdir.
READONLY: Fonksiyonlara gelen değerlerin fonksiyon içerisinde değiştirilmesini önlemek için kullanılır.
RETURNS: Scalar fonksiyondan dönecek değerin veri tipini belirlemek için kullanılır.
WITH: Saklı yordamlarda olduğu gibi ENCRYPTION gibi seçenekler bulunur. Ayrıca SCHEMABINDING ile tablolarda yapısal değişiklik yapılması engellenir.
SCALAR_DEGER: Fonksiyondan dönecek olan scalar değeri belirler.
1 2 3 4 5 6 7 8 9 10 11 |
CREATE FUNCTION HESAP_SAYISI(@BAKIYE_MIKTARI MONEY) --BAKIYE_MIKTARI adında MONEY tipinde parametre alan HESAP_SAYISI adında fonksiyon oluşturduk RETURNS INT --Fonksiyonun geri döndüreceği değer AS BEGIN DECLARE @HESAP_SAYISI2 INT --HESAP_SAYISI2 değişkeni oluşturuldu SELECT @HESAP_SAYISI2=COUNT(HESAP_NO) FROM HESAPLAR WHERE BAKIYE<@BAKIYE_MIKTARI --BAKIYE sütununda BAKIYE_MIKTARI parametresinden küçük olanları getir. Getirilenlerin sayısını değişkene ata RETURN @HESAP_SAYISI2 --değişkenin tuttuuğu değeri döndür END GO SELECT dbo.HESAP_SAYISI(6500) AS 'Hesap Sayısı', COUNT(BAKIYE) AS 'Toplam Bakiye' FROM HESAPLAR --HESAP_SAYISI fonksiyonuna 6500 değerini yolla gelen sonucun sütun adını Hesap Sayısı, COUNT fonksiyonu ile gelen toplam bakiyeyi Toplam Bakiye sütununda göster |
Yukarıda ki fonksiyon ile parametre olarak gelen değere göre kayıtlar getirilmşi ve bu değerlerin sayısı HESAP_SAYISI2 adlı bir dğeişkene yollanarak RETURN edilmiştir. En son yapılan SELECT sorgusu ile bu fonksiyon kullanılarak elde edlien değerlerin ekrana yansıması sağlanmıştır.
Sonucun ekran çıktısı yukarıda ki gibi olmaktadır.
Tablo Sonuçlu(Table Valued) Fonksiyonlar
Geriye bir tablo içeriği döndüren fonksiyonlar tablo sonuçlu fonksiyonlar olarak adlandırılır.
1 2 3 4 5 6 7 8 |
CREATE FUNCTION FONKSIYON_ISMI ([{@PARAMETRE VIRI_TIPI} [=DEFAULT] [READONLY]}] ) RETURNS TABLE [WITH SECENEKLER] AS RETURN (SELECT ifadesi) |
Yukarıda bu tür fonksyionların kullanım şekli verilmiştir.
1 2 3 4 5 6 7 |
CREATE FUNCTION KAYIT_GETIR(@BAKIYE_MIKTARI MONEY) --BAKIYE_MIKTARI adında MONEY tipinde parametre alan fonksiyon tanımlandı RETURNS TABLE --Fonksiyon Tablo değeri döndürecek. scalar fonksiyonlarda burada INT, VARCHAR(), MONEY gibi değerler geliyor AS RETURN(SELECT * FROM HESAPLAR WHERE BAKIYE<@BAKIYE_MIKTARI) --Geriye döndürülecek akyıtların sql sorgusu GO SELECT * FROM dbo.KAYIT_GETIR(5000) --burada tablo adına fonksiyonun ismini yazdığımıza dikkat edelim |
Yukarıda ki fonksiyonda 5000 değerinden küçük bakiyeye sahip hesaplar getirilecektir. Scalar fonksiyonlardan afrklı olarak ilk RETURNS ifadesinde TABLE tipinin aldığını ve ikinci RETURNS ifadesinde select sorgusuyla kayıtların elde edildiğini ve bunların döndürüldüğünü dikkat edelim. Fonksiyonu çağırmak için kullanılan en son select sorgusunda ise FROM ifadesinden sonra tablo adı yerine fonksiyonun adı yazılmıştır.
Ekran çıktısı yukarıda ki gibidir.
Çoklu İfade ile Tablo Sonuçlu(Multistatement Table-Valued) Fonksiyonlar
Geri döndürülecek tablo sonucu, fonksiyon içerisinde istenilen şekilde düzenlenebilen fonksiyonlara denir.
1 2 3 4 5 6 7 8 9 10 11 |
CREATE FUNCTION FONKSIYON_ISMI ([{@PARAMETRE VIRI_TIPI} [=DEFAULT] [READONLY]}] ) RETURNS @DEGISKEN_TABLO TABLE(TABLO SÜTUN ADLARI VE VERI TIPLERİ TANIMLARI) [WITH SECENEKLER] AS BEGIN FONKSIYONUN GERCEKLESTIRECEGI ISLEMLER VE DEGISKEN_tABLO INSERT ISLEMLERI RETURN END |
Yukarıda bu tür fonksyionların kullanım şekli verilmiştir.
1 2 3 4 5 6 7 8 9 10 11 |
CREATE FUNCTION HESAPLAR2_TABLOSU(@BAKIYE MONEY)--BAKIYE adında parametre tanımlı HESAPLAR2_TABLOSU fonksiyonu tanımlandı RETURNS @HESAP_GECICI TABLE(HESAP_NO INT, BAKIYE MONEY, YENI_BAKIYE2 MONEY) --TABLE tipinde değişken ve sütunları tanımlandı AS BEGIN INSERT INTO @HESAP_GECICI(HESAP_NO, BAKIYE, YENI_BAKIYE2) SELECT HESAPLAR.HESAP_NO, HESAPLAR.BAKIYE, HESAPLAR.BAKIYE FROM HESAPLAR WHERE BAKIYE<@BAKIYE --HESAPLAR tablosundan SELECT ile getirilen kayıtlar @HESAP_GECICI tablo değişkenine atandı UPDATE @HESAP_GECICI SET YENI_BAKIYE2=YENI_BAKIYE2*1.50 --HESAP_GECICI tablosunda YENI_BAKIYE2 adlı sütnların değeri %50 arttırıldı. RETURN --değeri döndür END GO SELECT * FROM HESAPLAR2_TABLOSU(5000) |
Yukarıda ki fonksiyon ile yeni bir tablo gösterimi sağlanmaktadır. BAKIYE bilgisi 5000 altında olan fonksiyonlar %50 oranında arttırılarak yeni bir tablo olarak sunulmaktadır. Diğer fonksiyon çeşitlerinden farklı olarak ilk RETURNS de tablo değişkeni adı ve sonrasında tabloya değer alanlar tnaımlanmıştır. Son RETURN ifadesinin yanına herhangi bir değişken veya select ifadesi yazılmamıştır. İşlemin ekran çıktısı aşağıda ki gibidir.
Teşekkürler başkan.