© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi HAFTA 9 © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Hatırlatma: Geçen hafta WHILE Deyimi ve Cursor kullandık. Bu hafta kullanıcı tanımlı fonksiyonlar nedir konusunu inceleyeceğiz. © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi IF NOT EXISTS(SELECT * FROM sysobjects WHERE name = ‘hatırlatma') begin CREATE TABLE hatırlatma (deger int) END GO DECLARE @counter int SET @counter = 1 WHILE @counter < =500 BEGIN INSERT INTO hatırlatma VALUES(@counter) SET @counter = @counter + 1 © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
DECLARE deneme3 CURSOR FOR SELECT EmployeeID,SicilNo from Employees DECLARE @a int DECLARE @id int DECLARE @sicil int set @a=1000 OPEN deneme3 FETCH NEXT FROM DENEME3 INTO @id,@Sicil WHILE (@@FETCH_STATUS=0) BEGIN update Employees set SicilNo=@a where EmployeeID=@id SET @a=@a+1 END DEALLOCATE deneme3
Sistem Fonksiyonları Her SQL Server veritabanında sistem fonksiyonlarının tanımları Programmability\Functions\System Functions altında mevcuttur Sorgularda kullandığımız çok-satır alıp tek satır döndüren Avg, Sum Max, Min ve Count gibi fonksiyonlar Aggregate Functions altındadır.
Peki fonksiyonlar neden kullanılır? Pratiklik: Bir işlemi her defasında yazmaktansa bir kere tanımlayıp, her yerden çağırma olanağı sunar. Kod Okunabilirliği: Bir script içerisinde daha az kod kullanılacağından dolayı, bizi kod karmaşasından kurtarır. © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Performans Bir sorgu çalışmadan önce 5 aşamadan geçer. Önce kodun yazım hataları, syntax 'ı, semantic 'i kontrol edilir(Parse). Daha sonra sorguda kullanılan tabloların kolonları var mı, ona bakılır(Resolve). Bu ıslemden sonra sorgunun sonucunu nasıl döndüreceğini, indexlemeleri kontrol eder(Optimize). Daha sonra döndüreceği şeklı belirledikten sonra derleme işlemi yapılır(Compile). Son olarak sorgu çalışır ve sonuç döner(Execute). Fonksiyonumuz çalıştığında, "compile" işlemi dahil compile 'dan önceki tüm aşamaları işlemeden geçer. Geriye sadece "execute" işlemi kalır. Bu da önemli bir hız demektir. © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
Kullanıcı Tanımlı Fonksiyonlar Sistem fonksiyonlarına ilave olarak kullanıcılar da 3 farklı türde fonksiyon tanımlayabilir: Table Valued Functions: Tablo döndürebildiği için sorguda tablo gibi kullanılabilen (from sonrasında yazılabilen) fonksiyonlar Scalar Valued Functions: bir yada birkaç parametre alıp, tek bir değer döndüren fonksiyonlar Aggregate Functions: Sum, Avg gibi çok değer alıp tek değer döndüren fonksiyonlar
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi CREATE FUNCTION BugununTarihi() returns datetime AS BEGIN DECLARE @Tarih DATETIME set @Tarih= GETDATE() RETURN @Tarih END select dbo.bugununtarihi() © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
Fonksiyon Örneği CREATE FUNCTION NetMaasHesapla ( @BurutMaas numeric(10,2) ) RETURNS numeric(10,2) AS BEGIN DECLARE @NetMaas numeric(10,2) IF (@BurutMaas > 5000) SET @NetMaas = @BurutMaas*0.80 ELSE SET @NetMaas = @BurutMaas*0.85 RETURN @NetMaas END
Select PerNo, Ad, Soyad, Maas AS [Bürüt Maaş], Fonksiyonu Kullanma Kullanıcı tanımlı fonksiyonlar da, yerleşik SQL fonksiyonları gibi sorgu içinde kullanılabilirler (SP kullanılamaz). Yerleşik (built in) fonksiyonlardan farklı olarak öncesinde şema ismi (dbo) yazılmalıdır. Select PerNo, Ad, Soyad, Maas AS [Bürüt Maaş], dbo.NetMaasHesapla(Maas) AS [Net Maaş] From Personel;
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Tablo olarak UDF Sayısal değerli fonksiyondan tek farkı döndürdüğü verinin tablo olmasıdır. Viewlerle büyük benzerlikler içerir ancak farklı olarak dışarıdan parametre alabilirler. Örneğin; "fn_ilegore " alıştırması bu tip bir fonksiyon sayesinde yapılmıştır. CREATE FUNCTION fn_ilegore (@deger varchar(50)) RETURNS table AS RETURN Select * from Personeller where Sehir=@deger Go select * from dbo.fn_ilegore('london') Oluşturulan örnek fonksiyona Programmability-> Functions-> Table-valued Functions yoluyla ulaşılabilir. Fonksiyonu çalıştırmak için aşağıdaki örnek kod çalıştırılmalıdır: © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi CREATE FUNCTION dbo.hesap1(@YIL INT,@AY int ) RETURNS MONEY begin DECLARE @toplam money SELECT @toplam=SUM (BirimFiyati*Miktar) FROM SatisDetaylari AS sd INNER JOIN Satislar as s ON sd.SatisID=s.SatisID WHERE (year(S.SatisTarihi)=@YIL) and (month(s.SatisTarihi)= @AY ) GROUP BY SatisTarihi RETURN @TOPLAM end SELECT dbo.hesap1(1996,9) © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
Prosedür ile Fonksiyon arasındaki Temel Farklar: Saklı Yordam (SY) Kullanıcı Tanımlı Fonksiyon (KTF) Select ifadesi içinde kullanılamaz Select ifadesi içinde kullanılabilir Genellikle bir işi gerçekleştirmek için kullanılır Genellikle bir hesaplama için kullanılır Değer döndürmesi şart değildir Mutlaka değer döndürmelidir Tüm veri türlerini döndürebilir Image gibi bazı veri türlerini döndüremez Daha fazla girdi parametresi alabilir (21000 adet) En fazla 1023 girdi parametresi alabilir Geçici tabloları kullanabilir Geçici tabloları kullanamaz Dinamik SQL yürütebilir Dinamik SQL yürütülemez Hata İşleme desteği vardır Hata işleme desteği yoktur (RAISEERROR veya @@ERROR kullanılamaz)
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi create function dbo.tarihFormatla (@tarih datetime,@ayrac nchar(1),@format nchar(3)) returns nchar(10) as begin declare @yil nchar(4) = year(@tarih) declare @ay nchar(2) = month(@tarih) declare @gun nchar(2) = day(@tarih) declare @formatliTarih nchar(10) if len(@gun) = 1 set @gun = '0' + @gun if len(@ay) = 1 set @ay = '0' + @ay if @format = 'dmy' set @formatliTarih = @gun + @ayrac + @ay + @ayrac + @yil else if @format = 'mdy' set @formatliTarih = @ay + @ayrac + @gun + @ayrac + @yil else if @format = 'ymd' set @formatliTarih = @yil + @ayrac + @ay + @ayrac + @gun return @formatliTarih end go select dbo.tarihFormatla(getdate(),'/','ymd') © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Parametre olarak verdiğimiz "ad" yada "soyad" 'a göre «Personeller» tablosundan veriler çeksin. "Select" ile çektiği veriler aynı zamanda belirttiğimiz geçici tabloma da "insert" etsin. Burada dikkat edilmesi gereken nokta tabloma ekleyeceğim verilerin, tablomun sütün sayısına ve sütunlarımın tiplerine uygun olması gerektiğidir. CREATE FUNCTION Kisilerim(@tip nvarchar(30)) RETURNS @Tablom TABLE (Id INT,Isim NVARCHAR(50)) AS BEGIN IF(@tip='ad') BEGIN INSERT @Tablom SELECT PersonelID,Adi FROM dbo.Personeller END ELSE IF(@tip='adsoyad') INSERT @Tablom SELECT PersonelID, Adi+' '+SoyAdi AS Isim FROM dbo.Personeller RETURN END Kullanım: SELECT * FROM Kisilerim('adsoyad') © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Öğrenci Numarası (otomatik artan olabilir), Adı Soyadı, Ders Adı, Vize, Final, Ortalama , Durum değerlerini içeren bir tablo oluşturunuz. İçerisine örnek değerler giriniz (en az 10 adet) Ortalama degeri Vizenin %40’ı ile finalin %60’ı alınarak hesaplanmaktadır. Durum alanı ise Ortalama ve Final değerleri kontrol edilerek hesaplanmaktadır. Ortalama>=50 ve Final>=50 ise GEÇTİNİZ yazılsın Final alanında -1 değeri varsa SINAVA GİRİLMEDİ yazılsın Bunların dışındaki durumda ise KALDINIZ yazılsın. © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi CREATE TABLE Ogrenciler1 (id int IDENTITY(1,1) NOT NULL PRIMARY KEY , adi_soyadi NVARCHAR (25), dersadi NVARCHAR (20), vize INT, final INT, ort as vize*0.4 + final*0.6, durum NVARCHAR(20) ) GO © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Veri Ekleme INSERT INTO Ogrenciler(adi_soyadi,dersadi,vize,final) VALUES ('Maria Anders','Veritabanı','50','90') INSERT INTO Ogrenciler(adi_soyadi,dersadi,vize,final) VALUES ('Ana Trujillo','Veritabanı','40','50') INSERT INTO Ogrenciler(adi_soyadi,dersadi,vize,final) VALUES ('Antonio Moreno','Veritabanı','30','80') INSERT INTO Ogrenciler(adi_soyadi,dersadi,vize,final) VALUES ('Thomas Hardy','Veritabanı','10','60') INSERT INTO Ogrenciler(adi_soyadi,dersadi,vize,final) VALUES ('Christina Berglund','Veritabanı','50','45') INSERT INTO Ogrenciler(adi_soyadi,dersadi,vize,final) VALUES ('Hanna Moos','Veritabanı','20','10') INSERT INTO Ogrenciler(adi_soyadi,dersadi,vize,final) VALUES ('Frédérique Citeaux','Veritabanı','50','60') INSERT INTO Ogrenciler(adi_soyadi,dersadi,vize,final) VALUES ('Martín Sommer','Veritabanı','60','50') INSERT INTO Ogrenciler(adi_soyadi,dersadi,vize,final) VALUES ('Laurence Lebihan','Veritabanı','65','70') INSERT INTO Ogrenciler(adi_soyadi,dersadi,vize,final) VALUES ('Elizabeth Lincoln','Veritabanı','40','100') © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi UPDATE ogrenciler SET durum = CASE WHEN ort<50 OR final<50 THEN 'Kaldı' WHEN final=-1 THEN 'Sınava Girmedi' ELSE 'Geçti' END GO SELECT * FROM Ogrenciler © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi