27.05: Uskladištene procedure (Stored Procedures) - Koncept, kreiranje, poziv i uklanjanje procedura
Uvod
Tokom rada sa bazama podataka često se izvršavaju isti SQL upiti više puta.
Na primer: prikaz svih filmova, pretraga filma po ID broju, dodavanje novih podataka, izmena postojećih podataka,...
Ako svaki put ponovo pišemo isti SQL kod: trošimo vreme, povećavamo mogućnost greške, otežavamo održavanje sistema.
Zbog toga SQL Server omogućava kreiranje uskladištenih procedura.
Uskladištene procedure predstavljaju unapred sačuvane SQL naredbe koje se nalaze u bazi podataka i mogu se izvršavati više puta po potrebi.
Možemo ih posmatrati kao:
„male programe smeštene unutar baze podataka“
1. Šta su uskladištene procedure?
Uskladištena procedura (Stored Procedure) predstavlja skup SQL naredbi koje se:
-
jednom kreiraju,
-
čuvaju u bazi,
-
izvršavaju po potrebi.
Procedure služe za: automatizaciju rada, organizaciju SQL koda, pojednostavljenje složenih operacija, povećanje bezbednosti baze, ...
Primer problema bez procedure
Ako često želimo prikaz svih filmova:
SELECT *
FROM Film;
Morali bismo stalno da ponavljamo isti kod.
Umesto toga možemo napraviti proceduru.
2. Razlika između funkcije i procedure
Najvažnije razlike su:
| Funkcija | Procedura |
|---|---|
| mora vratiti vrednost | ne mora vratiti vrednost |
| koristi RETURN | može, ali ne mora vraćati rezultat |
| koristi se unutar SELECT | poziva se pomoću EXEC |
| ne menja podatke (najčešće) | može menjati podatke |
Posmatrajte to ovako:
Funkcija = nešto izračuna i vrati rezultat.
Procedura = izvrši posao.
Na primer:
Funkcija:
„Koliko filmova postoji?“
Procedura:
„Prikaži sve filmove.“
3. Kreiranje procedure
Procedura se kreira pomoću naredbe:
CREATE PROCEDURE
Osnovna sintaksa
CREATE PROCEDURE naziv_procedure
AS
BEGIN
SQL naredbe
END
Objašnjenje:
-
CREATE PROCEDURE → kreira proceduru
-
naziv_procedure → ime procedure
-
BEGIN / END → blok naredbi
Primer 1 – Procedura za prikaz svih filmova
Napravimo proceduru koja prikazuje sve filmove.
CREATE PROCEDURE sp_SviFilmovi
AS
BEGIN
SELECT *
FROM Film;
END
Ovde:
-
sp_SviFilmovi→ naziv procedure -
SELECT * FROM Film→ prikaz svih filmova
Prefix sp_ znači stored procedure. - Nije obavezan, ali je dobra praksa.
5. Poziv procedure
Za pokretanje procedure koristi se:
EXEC naziv_procedure;
Primer:
EXEC sp_SviFilmovi;
ili
EXECUTE sp_SviFilmovi;
Rezultat: SQL Server izvršava proceduru i prikazuje sve filmove.
6. Procedura sa parametrima
Često želimo da procedura radi sa različitim vrednostima.
Na primer:
prikaz filma prema ID broju.
Tada koristimo parametre.
Primer 2 – Film po ID broju
CREATE PROCEDURE sp_FilmPoID
@id INT
AS
BEGIN
SELECT *
FROM Film
WHERE FilmID = @id;
END
Poziv procedure
EXEC sp_FilmPoID 3;
Rezultat: prikazuje film čiji je FilmID = 3.
Dodatno objašnjenje
@id predstavlja promenljivu koju korisnik unosi prilikom poziva procedure.
Ako unesemo:
EXEC sp_FilmPoID 5;
procedura će prikazati film sa ID = 5.
7. Procedura za dodavanje podataka
Za razliku od funkcija, procedure mogu menjati sadržaj tabela. Na primer, mogu dodavati podatke.
Primer 3 – Dodavanje filma
CREATE PROCEDURE sp_DodajFilm
@naziv VARCHAR(100),
@datum DATE
AS
BEGIN
INSERT INTO Film
(
Naziv,
DatumIzlaska
)
VALUES
(
@naziv,
@datum
);
END
Poziv procedure
EXEC sp_DodajFilm
'Matrix',
'1999-03-31';
Rezultat: novi film se dodaje u tabelu.
8. Procedura za izmenu podataka
Procedure mogu i menjati postojeće podatke.
Primer 4 – Izmena naziva filma
CREATE PROCEDURE sp_IzmeniFilm
@id INT,
@noviNaziv VARCHAR(100)
AS
BEGIN
UPDATE Film
SET Naziv = @noviNaziv
WHERE FilmID = @id;
END
Poziv procedure
EXEC sp_IzmeniFilm
3,
'Titanik 2';
9. Procedura za brisanje podataka
Procedure mogu brisati podatke.
Primer 5 – Brisanje filma
CREATE PROCEDURE sp_ObrisiFilm
@id INT
AS
BEGIN
DELETE FROM Film
WHERE FilmID = @id;
END
Poziv
EXEC sp_ObrisiFilm 4;
10. Uklanjanje procedure
Ako procedura više nije potrebna, može se obrisati.
Sintaksa:
DROP PROCEDURE naziv_procedure;
Primer:
DROP PROCEDURE sp_SviFilmovi;
Nakon toga procedura više ne postoji u bazi.
11. Prednosti uskladištenih procedura
Procedure imaju mnogo prednosti.
1. Ponovna upotreba: Kod se piše jednom. Koristi se više puta.
2. Brži rad: SQL Server čuva proceduru i optimizuje njeno izvršavanje.
3. Veća bezbednost: Korisnik može imati pravo da izvršava proceduru bez direktnog pristupa tabelama.
4. Jednostavnije održavanje: Ako treba promeniti logiku: menja se samo procedura.
5. Organizovaniji kod: Složeni sistemi postaju pregledniji.
12. Kada koristiti procedure?
Koristiti procedure kada:
često izvršavamo isti SQL kod
dodajemo podatke
menjamo podatke
brišemo podatke
automatizujemo posao
Ne koristiti procedure za jednostavne jednokratne SELECT upite.
13. Najčešće greške
1. Zaboravljen BEGIN/END
Pogrešno:
CREATE PROCEDURE sp_Test
SELECT * FROM Film
2. Pogrešan poziv procedure
Pogrešno:
SELECT sp_SviFilmovi();
Tačno:
EXEC sp_SviFilmovi;
3. Zaboravljen znak @ kod parametra
Zadaci za vežbu
Zadatak 1 - Napraviti proceduru: sp_SviGlumci koja prikazuje sve podatke iz tabele Glumac.
Zadatak 2 - Napraviti proceduru: sp_GlumacPoID koja prikazuje glumca prema ID broju.
Zadatak 3 - Napraviti proceduru koja dodaje novog producenta.
Zadatak 4 - Napraviti proceduru koja menja naziv žanra.
Zadatak 5 - Napraviti proceduru koja briše film prema ID broju.
Za kraj, najvažnije što treba zapamtiti :
-
kreiraju se pomoću
CREATE PROCEDURE -
pokreću se pomoću
EXEC -
mogu imati parametre
-
mogu menjati podatke
-
brišu se pomoću
DROP PROCEDURE