----------------------------------------------------------------------------------- /* Vježbe se rade na bazi AdventureWorksOBP. */ USE AdventureWorksOBP GO ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Zadatak 1. /* PROCEDURE BEZ PARAMETARA Napišite proceduru koja dohvaća sve retke iz tablice Drzava. Pozovite proceduru. Promijenite proceduru tako da vraća rezultate poredane padajuće po nazivu države. Uklonite proceduru. */ CREATE PROC p7 AS SELECT * FROM Drzava GO EXEC p7 GO ALTER PROC p7 AS SELECT * FROM Drzava ORDER BY Naziv DESC GO EXEC p7 GO DROP PROC p7 GO ----------------------------------------------------------------------------------- -- Zadatak 2. /* PROCEDURE BEZ PARAMETARA Napišite proceduru koja dohvaća prvih 5 redaka iz tablice Racun, prvih 5 redaka iz tablice Stavka i prvih 5 redaka iz tablice Proizvod. Pozovite proceduru. Uklonite proceduru. */ CREATE PROC p8 AS SELECT TOP 5 * FROM Racun SELECT TOP 5 * FROM Stavka SELECT TOP 5 * FROM Proizvod GO EXEC p8 GO DROP PROC p8 GO ----------------------------------------------------------------------------------- -- Zadatak 3. /* PROCEDURE S ULAZNIM PARAMETRIMA Napišite proceduru koja prima @ID proizvoda i vraća samo taj proizvod iz tablice Proizvod. Pozovite proceduru na oba načina. Uklonite proceduru. */ CREATE PROC p9 @IDPr int AS SELECT * FROM Proizvod WHERE IDProizvod = @IDPr GO EXEC p9 1 EXEC p9 @IDPr = 1 GO DROP PROC p9 GO ----------------------------------------------------------------------------------- -- Zadatak 4. /* PROCEDURE S ULAZNIM PARAMETRIMA Napišite proceduru koja prima dvije cijene i vraća nazive i cijene svih proizvoda čija je cijena u zadanom rasponu. Pozovite proceduru na oba načina. Uklonite proceduru. */ CREATE PROC p10 @Cijena1 money, @Cijena2 money AS SELECT Naziv, CijenaBezPDV FROM Proizvod WHERE CijenaBezPDV BETWEEN @Cijena1 AND @Cijena2 GO EXEC p10 500, 1000 EXEC p10 @Cijena1 = 500, @Cijena2 = 1000 EXEC p10 @Cijena2 = 1000, @Cijena1 = 500 GO DROP PROC p10 GO ----------------------------------------------------------------------------------- -- Zadatak 5. /* PROCEDURE S ULAZNIM PARAMETRIMA Napišite proceduru koja prima naziv države i naziv grada. Neka procedura umetne grad koji pripada zadanoj državi. Pazite na to postoji li već država upisana u tablicu Drzava ili ne postoji. Ako postoji, nemojte je umetati ponovno. Pozovite proceduru za državu “Japan” i grad “Osaka”. Pozovite proceduru za državu “Japan” i grad “Tokyo” i potvrdite da radi ispravno. Uklonite proceduru. */ CREATE PROC p11 @Drzava nvarchar(50), @Grad nvarchar(50) AS DECLARE @IDDrzava int SELECT @IDDrzava = IDDrzava FROM Drzava WHERE Naziv = @Drzava IF @IDDrzava IS NOT NULL BEGIN INSERT INTO Grad VALUES (@Grad, @IDDrzava) END ELSE BEGIN INSERT INTO Drzava VALUES (@Drzava) SET @IDDrzava = SCOPE_IDENTITY() INSERT INTO Grad VALUES (@Grad, @IDDrzava) END GO EXEC p11 'Japan', 'Osaka' SELECT * FROM Grad SELECT * FROM Drzava EXEC p11 'Japan', 'Tokyo' SELECT * FROM Grad SELECT * FROM Drzava GO DROP PROC p11 GO ----------------------------------------------------------------------------------- -- Zadatak 6. /* PROCEDURE S IZLAZNIM PARAMETRIMA Napišite proceduru koja prima parametre @IDProizvod i @Boja. Parametar @Boja neka bude izlazni parametar. Neka procedura za zadani proizvod vrati njegovu boju pomoću izlaznog parametra. Pozovite proceduru i ispišite vraćenu vrijednost. Uklonite proceduru. */ CREATE PROC p12 @IDProizvod int, @Boja nvarchar(15) OUTPUT AS SELECT @Boja = Boja FROM Proizvod WHERE IDProizvod = @IDProizvod GO DECLARE @Farba nvarchar(15) EXEC p12 320, @Farba OUTPUT PRINT @Farba GO DROP PROC p12 GO ----------------------------------------------------------------------------------- -- Zadatak 7. /* PROCEDURE S IZLAZNIM PARAMETRIMA Napišite proceduru koja prima kriterij po kojemu ćete filtrirati prezimena iz tablice Kupac. Neka procedura pomoću izlaznog parametra vrati broj zapisa koji zadovoljavaju zadani kriterij. Neka procedura vrati i sve zapise koji zadovoljavaju kriterij. Pozovite proceduru i ispišite vraćenu vrijednost. Uklonite proceduru. */ CREATE PROC p13 @Filter nvarchar(50), @BrojZapisa int OUTPUT AS SELECT @BrojZapisa = COUNT(*) FROM Kupac WHERE Prezime LIKE @Filter SELECT * FROM Kupac WHERE Prezime LIKE @Filter GO DECLARE @Cnt int EXEC p13 '%hu%', @Cnt OUTPUT PRINT @Cnt GO DROP PROC p13 GO ----------------------------------------------------------------------------------- -- Zadatak 8. /* PROCEDURE S IZLAZNIM PARAMETRIMA Napišite proceduru koja za zadanog komercijalistu pomoću izlaznih parametara vraća njegovo ime i prezime te ukupnu zaraðenu količinu novaca. */ CREATE PROC p14 @KomercijalistID int, @Ime nvarchar(50) OUTPUT, @Prezime nvarchar(50) OUTPUT, @Zaradio money OUTPUT AS SELECT @Ime = Ime, @Prezime = Prezime FROM Komercijalist WHERE IDKomercijalist = @KomercijalistID SELECT @Zaradio = SUM(s.UkupnaCijena) FROM Racun AS r INNER JOIN Stavka AS s ON r.IDRacun = s.RacunID WHERE r.KomercijalistID = @KomercijalistID GO DECLARE @Ime nvarchar(50), @Prezime nvarchar(50), @Zaradio money EXEC p14 276, @Ime OUTPUT, @Prezime OUTPUT, @Zaradio OUTPUT PRINT @Ime PRINT @Prezime PRINT @Zaradio GO DROP PROC p14 GO ----------------------------------------------------------------------------------- -- Zadatak 9. jedno moguće rješenje (bolje). /* DODATNI ZADACI Napišite proceduru koja umeće novu kategoriju i kroz izlazni parametar vraća generiranu IDENTITY vrijednost. Ako već postoji kategorija zadanog imena, ne treba je upisivati ponovno i u tom slučaju kroz izlazni parametar vratite vrijednost -1. Pozovite proceduru i ispišite vraćenu vrijednost. Uklonite proceduru. */ CREATE PROC p15 @Kategorija nvarchar(50), @ID int OUTPUT AS IF NOT EXISTS(SELECT * FROM Kategorija WHERE Naziv = @Kategorija) BEGIN INSERT INTO Kategorija VALUES (@Kategorija) SET @ID = SCOPE_IDENTITY() END ELSE BEGIN SET @ID = -1 END GO ----------------------------------------------------------------------------------- -- Zadatak 9. drugo moguće rješenje (lošije). /* DODATNI ZADACI Napišite proceduru koja umeće novu kategoriju i kroz izlazni parametar vraća generiranu IDENTITY vrijednost. Ako već postoji kategorija zadanog imena, ne treba je upisivati ponovno i u tom slučaju kroz izlazni parametar vratite vrijednost -1. Pozovite proceduru i ispišite vraćenu vrijednost. Uklonite proceduru. */ CREATE PROC p15 @Kategorija nvarchar(50), @ID int OUTPUT AS DECLARE @Broj int SELECT @Broj = COUNT(*) FROM Kategorija WHERE Naziv = @Kategorija IF @Broj = 0 BEGIN INSERT INTO Kategorija VALUES (@Kategorija) SET @ID = SCOPE_IDENTITY() END ELSE BEGIN SET @ID = -1 END GO DECLARE @ID int EXEC p15 'Glačala', @ID OUTPUT PRINT @ID GO DECLARE @ID int EXEC p15 'Glačala', @ID OUTPUT PRINT @ID GO DROP PROC p15 GO ----------------------------------------------------------------------------------- -- Zadatak 10. /* DODATNI ZADACI Napišite proceduru koja kroz tri izlazna parametra vraća najmanju, najveću i prosječnu cijenu proizvoda iz tablice Proizvod. Neka procedura vrati i sve proizvode koji imaju cijenu veću od 0 i manju od prosječne. Pozovite proceduru, ispišite vraćene vrijednosti i uklonite proceduru. */ CREATE PROC p16 @Najmanja money OUTPUT, @Najveca money OUTPUT, @Prosjecna money OUTPUT AS SELECT @Najmanja = MIN(CijenaBezPDV), @Najveca = MAX(CijenaBezPDV), @Prosjecna = AVG(CijenaBezPDV) FROM Proizvod SELECT * FROM Proizvod WHERE CijenaBezPDV > 0 AND CijenaBezPDV < @Prosjecna GO DECLARE @Najmanja money, @Najveca money, @Prosjecna money EXEC p16 @Najmanja OUTPUT, @Najveca OUTPUT, @Prosjecna OUTPUT PRINT @Najmanja PRINT @Najveca PRINT @Prosjecna GO DROP PROC p16 GO ----------------------------------------------------------------------------------- -- Zadatak 11. /* PROCEDURE S RETURN PARAMETRIMA Napišite proceduru koja prima ime i prezime osobe i vraća 0 kao RETURN parametar ako osoba postoji u tablici, odnosno 200 ako osoba ne postoji. Pozovite proceduru i ispišite RETURN vrijednost. */ CREATE PROC p15 @Ime nvarchar(50), @Prezime nvarchar(50) AS DECLARE @BrojOsoba int SELECT @BrojOsoba = Count(*) FROM Kupac WHERE Ime = @Ime AND Prezime = @Prezime IF @BrojOsoba = 0 RETURN 200 ELSE RETURN 0 GO DECLARE @RetVal int EXEC @RetVal = p15 'Amy', 'Albertss' PRINT @RetVal GO ----------------------------------------------------------------------------------- -- Zadatak 12. /* PROCEDURE S RETURN PARAMETRIMA Promijenite proceduru iz prethodnog zadatka tako da bude zaštićena. */ ALTER PROC p15 @Ime nvarchar(50), @Prezime nvarchar(50) WITH ENCRYPTION AS DECLARE @BrojOsoba int SELECT @BrojOsoba = Count(*) FROM Kupac WHERE Ime = @Ime AND Prezime = @Prezime IF @BrojOsoba = 0 RETURN 200 ELSE RETURN 0 GO ----------------------------------------------------------------------------------- -- Zadatak 13. /* PROCEDURE S RETURN PARAMETRIMA Uklonite proceduru. */ DROP PROC p15 GO -----------------------------------------------------------------------------------