20.05. Korisnički definisane funkcije
Uvod
Tokom rada sa bazama podataka često se javlja potreba da se određeni SQL kod ponavlja. Na primer, može biti potrebno više puta izračunati broj filmova, pronaći naziv filma na osnovu identifikatora ili prikazati određenu grupu podataka.
Pisanje istog SQL koda više puta nije praktično jer produžava vreme rada, povećava mogućnost greške i otežava održavanje baze podataka.
Zbog toga SQL Server omogućava kreiranje korisnički definisanih funkcija (User Defined Functions – UDF).
Funkcije omogućavaju da se određeni SQL kod jednom napiše i kasnije koristi više puta.
Možemo ih zamisliti kao:
„male programe unutar baze podataka koji izvršavaju određeni zadatak i vraćaju rezultat“
1. Koncept korisnički definisanih funkcija
Korisnički definisana funkcija predstavlja SQL objekat koji:
-
prima parametre (po potrebi),
-
izvršava određenu logiku,
-
vraća rezultat.
Za razliku od običnih SELECT upita, funkcija se može više puta koristiti bez ponovnog pisanja istog koda.
Na primer, umesto da stalno pišemo:
SELECT COUNT(*)
FROM Film;
možemo napraviti funkciju koja taj posao obavlja za nas.
Prednosti korišćenja funkcija
Korišćenje funkcija donosi više prednosti:
1. Ponovna upotreba koda: Kod se piše jednom, a koristi više puta.
2. Jednostavniji upiti: Složeni SQL kod postaje pregledniji.
3. Lakše održavanje: Ako treba promeniti logiku, menja se samo funkcija.
2. Kreiranje funkcije
Funkcija se kreira pomoću naredbe:
CREATE FUNCTION
Osnovna sintaksa izgleda ovako:
CREATE FUNCTION naziv_funkcije()
RETURNS tip_podatka
AS
BEGIN
RETURN vrednost
END
Delovi funkcije:
-
CREATE FUNCTION → kreira funkciju
-
naziv_funkcije → ime funkcije
-
RETURNS → određuje tip rezultata
-
RETURN → vraća rezultat
Primer jednostavne funkcije
Napravimo funkciju koja vraća tekstualnu poruku.
CREATE FUNCTION fn_Pozdrav()
RETURNS VARCHAR(50)
AS
BEGIN
RETURN 'Dobrodošli u bazu podataka'
END
Poziv funkcije
Funkcija se poziva pomoću SELECT naredbe.
SELECT dbo.fn_Pozdrav();
Rezultat:
Dobrodošli u bazu podataka
Ovde:
-
dbo predstavlja šemu baze,
-
fn_Pozdrav() naziv funkcije.
Uklanjanje funkcije
Ako funkcija više nije potrebna, može se obrisati.
Sintaksa:
DROP FUNCTION naziv_funkcije;
Primer:
DROP FUNCTION fn_Pozdrav;
Nakon toga funkcija više ne postoji u bazi.
3. Funkcije koje vraćaju jednu vrednost (Scalar Functions)
Najčešći tip funkcija su funkcije koje vraćaju jednu vrednost.
One mogu vratiti: broj, tekst, datum, logičku vrednost.
Zovu se scalar funkcije.
Primer 1 – Broj filmova: Napravićemo funkciju koja vraća ukupan broj filmova.
CREATE FUNCTION fn_BrojFilmova()
RETURNS INT
AS
BEGIN
DECLARE @broj INT;
SELECT @broj = COUNT(*)
FROM Film;
RETURN @broj;
END
Poziv funkcije
SELECT dbo.fn_BrojFilmova();
Objašnjenje
Funkcija:
-
definiše promenljivu
@broj -
broji filmove
-
smešta rezultat u promenljivu
-
vraća rezultat
Primer 2 – Funkcija sa parametrom
Često želimo da funkcija radi sa različitim podacima. U tu svrhu koristimo parametre.
Primer:
CREATE FUNCTION fn_NazivFilma
(
@id INT
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @naziv VARCHAR(100);
SELECT @naziv = Naziv
FROM Film
WHERE FilmID = @id;
RETURN @naziv;
END
Poziv funkcije
SELECT dbo.fn_NazivFilma(3);
Rezultat:
Kum
Kada koristiti scalar funkcije?
Koriste se kada želimo: jednu vrednost, kao na primer izračunavanje rezultata, i kada želimo pojednostavljenje upita.
Na primer: broj učenika, naziv filma, cena proizvoda, datum nečega.
4. Funkcije koje vraćaju tabelu (Table-Valued Functions)
Neke funkcije ne vraćaju samo jednu vrednost, već više redova podataka. Takve funkcije vraćaju tabelu.
Možemo ih posmatrati kao:
„SELECT upit koji je pretvoren u funkciju“
Sintaksa
CREATE FUNCTION naziv()
RETURNS TABLE
AS
RETURN
(
SELECT ...
)
Primer 1 – Lista filmova
CREATE FUNCTION fn_Filmovi()
RETURNS TABLE
AS
RETURN
(
SELECT Naziv, DatumIzlaska
FROM Film
)
Poziv funkcije
Poziva se kao tabela:
SELECT *
FROM dbo.fn_Filmovi();
Primer 2 – Funkcija sa parametrom
Prikaz filmova jednog žanra.
CREATE FUNCTION fn_FilmoviPoZanru
(
@zanrID INT
)
RETURNS TABLE
AS
RETURN
(
SELECT Naziv
FROM Film
WHERE ZanrID = @zanrID
)
Poziv funkcije
SELECT *
FROM dbo.fn_FilmoviPoZanru(2);
Prednosti funkcija koje vraćaju tabelu
- pregledniji kod
- mogu se koristiti kao tabela
- pojednostavljuju složene upite
Razlika između funkcija koje vraćaju jednu vrednost i tabelu
| Scalar funkcija | Table-valued funkcija |
|---|---|
| vraća jednu vrednost | vraća više redova |
| koristi RETURNS INT, VARCHAR… | koristi RETURNS TABLE |
| koristi RETURN vrednost | koristi RETURN (SELECT) |
Primeri za bazu A13_DVD
Funkcija koja vraća broj glumaca
CREATE FUNCTION fn_BrojGlumaca()
RETURNS INT
AS
BEGIN
DECLARE @broj INT;
SELECT @broj = COUNT(*)
FROM Glumac;
RETURN @broj;
END
Funkcija koja vraća sve producente
CREATE FUNCTION fn_Producenti()
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM Producent
)
Zadaci
Zadatak 1 - Napraviti funkciju koja vraća broj žanrova.
Zadatak 2 - Napraviti funkciju koja vraća naziv glumca na osnovu ID-a.
Zadatak 3 - Napraviti funkciju koja vraća sve filmove.
Zadatak 4 - Napraviti funkciju koja vraća filmove određenog producenta.
Zadatak 5 - Obrisati jednu kreiranu funkciju.
Zaključak - najvažnije što treba zapamtiti:
-
funkcije izvršavaju određeni zadatak,
-
mogu vraćati jednu vrednost ili tabelu,
-
mogu imati parametre,
-
kreiraju se jednom, a koriste više puta.
Funkcije omogućavaju da baza podataka postane fleksibilnija, preglednija i lakša za održavanje.