SVEUČILIŠTE U MOSTARU FAKULTET PRIRODOSLOVNO-MATEMATIČKIH I ODGOJNIH ZNANOSTI BAZE PODATAKA 2 Doc.dr.sc. GORAN KRALJEVIĆ BAZE PODATAKA 2 1
Baze podataka 2 Web: http://www.fpmoz.ba/gkraljevic Pitanja, primjedbe, dogovor za konzultacije... o E-mail: goran.kraljevic@hteronet.ba goran.kraljevic@sve-mo.ba BAZE PODATAKA 2 2
BAZE PODATAKA 2 3
Microsoft SQL Server: T-SQL T-SQL (Transact-SQL) BAZE PODATAKA 2 4
Lokalne varijable se deklariraju od strane korisnika korištenjem ključne riječi DECLARE. DECLARE @v_ime VARCHAR(25), @v_prezime VARCHAR(25), @v_datum_zaposlenja DATETIME, @v_placa NUMERIC(7,2)... BAZE PODATAKA 2 5
Globalne varijable su predefinirane od strane SQL sustava. Neke od najčešće korištenih globalnih varijabli su: o @@ERROR ova varijabla se često koristi za kontrolu uspješnog obavljanja pojedinih SQL instrukcija (ukoliko je SQL instrukcija uspješno obavljena vrijednost varijable je 0). o @@ROWCOUNT ova varijabla sadrži podatak o broju redova na koje djeluje posljednji SQL izraz. o @@IDENTITY ova varijabla sadrži podatak o posljednjoj generiranoj IDENTITY vrijednosti. BAZE PODATAKA 2 6
Vrijednost varijabli se pridjeljuje u sklopu SELECT izraza: SELECT @varijabla = SQL izraz DECLARE @v_sum_placa NUMERIC(7,2) SELECT @v_sum_placa = SUM(placa) FROM djelatnik SELECT 'Ukupna suma placa je: ' + convert(varchar(10), @v_sum_placa) BAZE PODATAKA 2 7
T-SQL Kontrola programskog toka BAZE PODATAKA 2 8
IF uvjet SQL izraz [ELSE IF uvjet SQL izraz] [ELSE SQL izraz] WHILE uvjet SQL izraz [BREAK] SQL izraz [CONTINUE] IF i ELSE uvjet pokreću izvršavanje samo jedne SQL naredbe. Ukoliko je potrebno u zavisnosti u uvjetnom izrazu pokrenuti više SQL naredbi, te naredbe treba definirati kao blok BEGIN END. Izvršavanje SQL naredbi unutar WHILE petlje može se kontrolirati primjenom naredbe prekida (BREAK) i nastavka izvršavanja (CONTINUE). BAZE PODATAKA 2 9
T-SQL rad sa kursorima: DECLARE naziv_kursora CURSOR FOR SELECT... OPEN naziv_kursora FETCH NEXT FROM naziv_kursora INTO @... WHILE @@FETCH_STATUS = 0 BEGIN... FETCH NEXT FROM naziv_kursora INTO @... END CLOSE naziv_kursora DEALLOCATE naziv_kursora BAZE PODATAKA 2 10
Kreiranje pohranjene procedure: CREATE PROCEDURE naziv_procedure {@parametar1 tip_podatka1} [OUTPUT] {@parametar2 tip_podatka2} [OUTPUT] [WITH {RECOMPILE ENCRYPTION}] AS SQL izrazi... ; Pohranjene procedure se koriste u prekompajliranom i optimiziranom obliku. Pri kreiranju procedure mogu se koristiti opcije RECOMPILE (proceduru je potrebno iznova kompajlirati pri svakom izvršavanju) i ENCRYPTION (sigurnosno kodiranje SQL procedure). BAZE PODATAKA 2 11
Poziv pohranjene procedure: EXECUTE (EXEC) naziv_procedure @parametar1=vrijednost1, @parametar2=vrijednost2,... Izvršavanje procedure završava kada se izvrši posljednja instrukcija u proceduri ili izvršenjem naredbe RETURN (RETURN znači bezuvjetan izlaz iz procedure). Za detekciju greške u izvršavanju pojedinog SQL izraza koristi se sistemska (globalna) varijabla @@ERROR. @@ERROR=0 znači da je SQL instrukcija ispravno obavljena, a ako nastupi greška, varijabla @@ERROR sadrži brojčani podatak (integer), koji predstavlja kod pogreške. Korisnički definirana greška: o RAISERROR ('Greška...',16,-1) BAZE PODATAKA 2 12
Kreiranje funkcije: CREATE FUNCTION naziv_funkcije ( {@parametar1 tip_podatka1} {@parametar2 tip_podatka2} ) RETURNS tip_podatka AS SQL izrazi... ; Napomena: Mora postojati najmanje jedan RETURN iskaz! BAZE PODATAKA 2 13
Kreiranje okidača (trigera): CREATE TRIGGER naziv_okidaca ON naziv_tablice FOR INSERT UPDATE DELETE AS SQL izrazi... ; IF UPDATE (naziv_atributa) Izraz kojim se unutar okidača kojeg je aktivirala UPDATE naredba provjerava da li je riječ o ažuriranju navedenog atributa unutar tablice. BAZE PODATAKA 2 14
Nakon nastupanja promjena u određenoj tablici zbog unosa, promjene ili brisanja podataka (INSERT, UPDATE ili DELETE), interni mehanizam baze podataka (SQL Server) stvara dvije privremene tablice: o inserted o deleted INSERT naredba: o Stvara se redak u tablici inserted. UPDATE naredba: o Stvara se redak u tablici deleted (stara vrijednost, prije update-a). o Stvara se redak u tablici inserted (nova vrijednost, poslije update-a). DELETE naredba: o Stvara se redak u tablici deleted. BAZE PODATAKA 2 15
Primjeri BAZE PODATAKA 2 16
Testna baza (napunjena testnim podacima... ) BAZE PODATAKA 2 17
Pohranjene procedure Primjer CREATE PROCEDURE povecaj_placu @p_id NUMERIC(5), @p_iznos NUMERIC(7,2) AS DECLARE @v_placa NUMERIC(7,2), @v_sifra_radmj VARCHAR(10) BEGIN SELECT @v_placa = placa, @v_sifra_radmj = sifra_radmj FROM djelatnik WHERE id_djelatnika = @p_id; IF NOT (@v_sifra_radmj='dir') AND @v_placa + @p_iznos > 3000 BEGIN RAISERROR('Potrebno provjeriti iznos place!',16,-1) END ELSE BEGIN UPDATE djelatnik SET placa = placa + @p_iznos WHERE id_djelatnika = @p_id; END END BAZE PODATAKA 2 18
Pohranjene procedure Primjer T-SQL Poziv pohranjene procedure: DECLARE @status INT EXEC @status = povecaj_placu 1, 100 IF @status=0 SELECT 'Ok!'; ELSE SELECT 'Greška!'; BAZE PODATAKA 2 19
Pohranjene procedure Primjer CREATE PROCEDURE insert_djelatnika @p_id_djelatnika NUMERIC(5), @p_ime VARCHAR(25), @p_prezime VARCHAR(25), @p_spol CHAR(2), @p_datum_zaposlenja DATETIME, @p_placa NUMERIC(7,2), @p_id_sefa NUMERIC(5), @p_sifra_opcine NUMERIC(5), @p_sifra_radmj VARCHAR(10) AS BEGIN IF EXISTS (SELECT 'x' FROM radno_mjesto WHERE sifra_radmj = @p_sifra_radmj) BEGIN INSERT INTO djelatnik (id_djelatnika, ime, prezime, spol, datum_zaposlenja, placa, id_sefa, sifra_opcine, sifra_radmj) VALUES (@p_id_djelatnika, @p_ime, @p_prezime, @p_spol, @p_datum_zaposlenja, @p_placa, @p_id_sefa, @p_sifra_opcine, @p_sifra_radmj); SELECT 'INSERT djelatnika uspješno izvršen!'; END ELSE RAISERROR('Ne postoji navedeno radno mjesto!',16,-1) END BAZE PODATAKA 2 20
Pohranjene procedure Primjer T-SQL Poziv pohranjene procedure: EXEC insert_djelatnika @p_id_djelatnika = 151, @p_ime = 'Ante', @p_prezime = 'Antić', @p_spol = 'M', @p_datum_zaposlenja = '2013-01-01', @p_placa = 1000, @p_id_sefa = 100, @p_sifra_opcine = 20, @p_sifra_radmj = 'IT-PROG'; BAZE PODATAKA 2 21
Funkcije Primjer CREATE FUNCTION placa_djelatnika (@p_id_djelatnika NUMERIC(5)) RETURNS NUMERIC AS BEGIN DECLARE @v_placa NUMERIC(7,2) SELECT @v_placa = placa FROM djelatnik WHERE id_djelatnika = @p_id_djelatnika; RETURN @v_placa; END T-SQL Poziv funkcije: DECLARE @p_id_djelatnika NUMERIC(5), @placa NUMERIC(7,2) EXEC @placa = placa_djelatnika @p_id_djelatnika = 1 SELECT 'Placa djelatnika iznosi: ' + convert(varchar(10), @placa); BAZE PODATAKA 2 22
Testna baza (proširena tablicom koju će puniti okidač... ) Okidač BAZE PODATAKA 2 23
Okidači Primjer CREATE TRIGGER audit_djelatnika ON djelatnik FOR INSERT, UPDATE AS DECLARE @id_djelatnika NUMERIC(5), @stara_placa NUMERIC(7,2), @nova_placa NUMERIC(7,2) BEGIN SELECT @id_djelatnika = id_djelatnika, @nova_placa = placa FROM inserted; SELECT @stara_placa = placa FROM deleted; IF UPDATE(placa) AND EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted) INSERT INTO DJELATNIK_AUDIT (id_djelatnika, stara_placa, nova_placa, datum, akcija) VALUES (@id_djelatnika, @stara_placa, @nova_placa, GETDATE(), 'UPDATE'); IF EXISTS (SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted) INSERT INTO DJELATNIK_AUDIT (id_djelatnika, stara_placa, nova_placa, datum, akcija) VALUES (@id_djelatnika, @stara_placa, @nova_placa, GETDATE(), 'INSERT'); END BAZE PODATAKA 2 24
Baze podataka 2 Web: http://www.fpmoz.ba/gkraljevic Pitanja, primjedbe, dogovor za konzultacije... o E-mail: goran.kraljevic@hteronet.ba goran.kraljevic@sve-mo.ba BAZE PODATAKA 2 25