-- KULLANICI TANIMLI FONKSİYONLAR --
use Filmler
-- 1) Scalar Functions:
-- Geriye tek bir değer döndüren fonksiyon.
--------------------------------------------------------------------------------------------------------
--create function fn_fonksiyonadi(parametreler) returns dönüştipi
--as
--begin
-- ...........................
-- return dönüştipinde_değer
--end
--------------------------------------------------------------------------------------------------------
-- İki parametrenin toplamını geriye döndüren fonksiyon?
go
create function fn_topla(@sayi1 int, @sayi2 int) returns int
as
begin
declare @toplam int
set @toplam = @sayi1 + @sayi2
return @toplam
end
-- Database'in içinde, Programmability içinde, Functions içinde, Scalar-values Function içinde tutulur!
--------------------------------------------------------------------------------------------------------
go
select dbo.fn_topla(12, 44) as ikisayitoplami
--------------------------------------------------------------------------------------------------------
go
drop function fn_topla
--------------------------------------------------------------------------------------------------------
-- İlk 3 filmin gişe ortalaması?
go
select top 3 * from Film
go
create function fn_ilkucfilmingiseortalamasi (@gise1 money, @gise2 money, @gise3 money, @filmsayisi int)
returns money
as
begin
declare @toplam money, @ortalamagise money
set @toplam = @gise1 + @gise2 + @gise3
set @ortalamagise = @toplam / @filmsayisi
return @ortalamagise
end
--------------------------------------------------------------------------------------------------------
-- Bir sütun ve satırda arada - bırakılarak birleştirilen ilk 3 film adı?
go
create function fn_ilkucfilmadinibirlestir (@ad1 varchar(30), @ad2 varchar(30), @ad3 varchar(30))
returns varchar(100)
as
begin
declare @adlarbirlesmis varchar(100)
set @adlarbirlesmis = @ad1 + ' - ' + @ad2 + ' - ' + @ad3
return @adlarbirlesmis
end
--------------------------------------------------------------------------------------------------------
go
declare @hasilat1 money, @hasilat2 money, @hasilat3 money,
@filmadi1 varchar(30), @filmadi2 varchar(30), @filmadi3 varchar(30),
@ilkucfilmadi varchar(100)
select @hasilat1 = gisesi from Film where id = 1
select @hasilat2 = gisesi from Film where id = 2
select @hasilat3 = gisesi from Film where id = 4
select @filmadi1 = adi from Film where id = 1
select @filmadi2 = adi from Film where id = 2
select @filmadi3 = adi from Film where id = 4
select dbo.fn_ilkucfilmadinibirlestir (@filmadi1, @filmadi2, @filmadi3) as ilkucfilmadi,
dbo.fn_ilkucfilmingiseortalamasi (@hasilat1, @hasilat2, @hasilat3, 3) as ilkucfilmortalamagisesi
go
drop function fn_ilkucfilmadinibirlestir
go
drop function fn_ilkucfilmingiseortalamasi
--------------------------------------------------------------------------------------------------------
-- Parametre olarak gönderilen ayraçla tarih yaz?
go
create function fn_tarihyaz (@tarih datetime, @ayrac char(1)) returns varchar(10)
as
begin
declare @sonuc varchar(10), @gun varchar(2), @ay varchar(2), @yil varchar(4)
select @gun = DAY(@tarih)
select @ay = MONTH(@tarih)
select @yil = YEAR(@tarih)
set @sonuc = @gun + @ayrac + @ay + @ayrac + @yil
return @sonuc
end
--------------------------------------------------------------------------------------------------------
go
select dbo.fn_tarihyaz (GETDATE(), '=') as tarih
go
drop function fn_tarihyaz
--------------------------------------------------------------------------------------------------------
-- Fonksiyonları tablo yaratırken de kullanabiliyoruz:
--create table Urun
--(
-- id int primary key identity(1, 1),
-- adi varchar(50),
-- fiyati money,
-- adeti int,
-- kdvlifiyati as dbo.fn_kdvlifiyati (fiyati, adeti)
--)
--------------------------------------------------------------------------------------------------------
-- Bir cümleyi şifreleyecek fonksiyon?
go
create function fn_sifrele (@input varchar(20)) returns varchar(20)
as
begin
declare @i int, @output varchar(20)
set @output = ''
set @i = 1
while @i <= LEN(@input)
begin
set @output = @output + char(ASCII(SUBSTRING(@input, @i, 1)) - 1)
set @i = @i + 1
end
return @output
end
--------------------------------------------------------------------------------------------------------
go
create function fn_desifrele (@input varchar(20)) returns varchar(20)
as
begin
declare @i int, @output varchar(20)
set @output = ''
set @i = 1
while @i <= LEN(@input)
begin
set @output = @output + char(ASCII(SUBSTRING(@input, @i, 1)) + 1)
set @i = @i + 1
end
return @output
end
--------------------------------------------------------------------------------------------------------
go
select dbo.fn_desifrele ('TRJTLQT') as desifrelenmis, dbo.fn_sifrele ('USKUMRU') as sifrelenmis
go
drop function fn_desifrele
go
drop function fn_sifrele
--------------------------------------------------------------------------------------------------------
-- 2) Inline Functions:
-- Geriye sadece tablo döndürür, içine attığımız parametreler üzerinde oynamamızı sağlamaz.
go
create function fn_inlinefilmtablo (@filmadi varchar(30)) returns table
as
return (select * from Film where adi = @filmadi)
--------------------------------------------------------------------------------------------------------
go
select * from dbo.fn_inlinefilmtablo ('Avatar')
go
drop function fn_inlinefilmtablo
--------------------------------------------------------------------------------------------------------
-- 3) Multi-Statement Functions:
-- Geriye tablo döndürür, içine attığımız parametreler üzerinde oynamamızı sağlar.
-- Fonksiyonu çalıştırdığımız zaman select * from @yedektablo otomatik olarak çalışır.
go
create function fn_multistatementtabloyedekle (@tabloadi varchar(10))
returns @yedektablo table (id int, adi varchar(300))
as
begin
if @tabloadi = 'Film'
begin
insert into @yedektablo select id, adi from Film
end
else if @tabloadi = 'Yonetmen'
begin
insert into @yedektablo select id, adi + SPACE(1) + soyadi from Yonetmen
end
else if @tabloadi = 'Oyuncu'
begin
insert into @yedektablo select id, adi + SPACE(1) + soyadi from Oyuncu
end
return
end
--------------------------------------------------------------------------------------------------------
go
select * from dbo.fn_multistatementtabloyedekle ('Film')
select * from dbo.fn_multistatementtabloyedekle ('Yonetmen')
select * from dbo.fn_multistatementtabloyedekle ('Oyuncu')
go
drop function fn_multistatementtabloyedekle
--------------------------------------------------------------------------------------------------------
-- Yapım yılına göre film adları ve toplam gişeleri:
create function fn_filmToplamGise(@yapimyili char(4))
returns @resulttable table (adi varchar(100), toplamgise float)
as
begin
if @yapimyili = '*'
begin
insert into @resulttable (adi, toplamgise)
select adi, SUM(gisesi) from Film group by adi
end
else
begin
insert into @resulttable select adi, SUM(gisesi) from Film
where yapimyili = @yapimyili
group by adi
end
return
end
select * from dbo.fn_filmToplamGise('2009')
select * from dbo.fn_filmToplamGise('*')