USE AdventureWorksOBP --Ishod 4-- --Zad 1-- /* Osmislite XML podatak u kojem je mogu�e proceduri odjednom poslati nazive vi�e gradova iz Hrvatske. Kreirajte proceduru koja prima takav XML podatak, upisuje poslane gradove i ve�e ih stranim klju�em uz Hrvatsku. Napravite poziv procedure kojim prikazujete njezinu funkcionalnost. */ DECLARE @gradoviHr xml; SET @gradoviHr = ' Zabok Sisak Zagreb ' EXEC upisiGradove @gradoviHr CREATE OR ALTER PROC upisiGradove @xml xml AS BEGIN DECLARE @hrId INT SELECT @hrId=IDDrzava FROM Drzava WHERE Naziv IN ( SELECT tbl.stupac.value('@Drzava', 'NVARCHAR(50)') FROM @xml.nodes('/Gradovi') as tbl(stupac) ) INSERT INTO Grad(Naziv, DrzavaID) SELECT tbl.stupac.value('.', 'NVARCHAR(50)'), @hrId FROM @xml.nodes('/Gradovi/Grad') as tbl(stupac) END SELECT * FROM Grad DROP PROC upisiGradove --Zad 2-- /* Napi�ite proceduru koja u jednom pozivu omogu�uje upis vi�e komercijalista u tablicu Komercijalist. Koristite tabli�ne varijable. Napravite poziv procedure kojim prikazujete njezinu funkcionalnost. Za provjeru napisati upit kojim prikazujete komercijaliste upisane kreiranom procedurom. */ CREATE TYPE kType AS TABLE ( Ime NVARCHAR(50), Prezime NVARCHAR(50), StalniZaposlenik bit ) DECLARE @komercijalisti kType INSERT INTO @komercijalisti VALUES ('Ivek', 'Ivica', 1), ('Marija', 'Maric', 0), ('Ivo', 'Simic', 1) EXEC prUpisiKom @komercijalisti CREATE OR ALTER PROC prUpisiKom @kom kType READONLY AS BEGIN INSERT INTO Komercijalist SELECT * FROM @kom END SELECT * FROM Komercijalist WHERE IDKomercijalist BETWEEN 292 AND 294 DROP PROC prUpisiKom DROP TYPE kType --Zad 3-- /* Napi�ite proceduru koja prima XML dokument oblika: Procedura treba provjeriti postoji li poslana dr�ava, grad i kupac u bazi (gledano po nazivima odnosno imenu i prezimenu). Ukoliko neki od navedenih podataka nedostaje u bazi, procedura ih treba upisati u pripadaju�e tablice. Za provjeru izvr�iti proceduru dva puta: kad poslana dr�ava, grad i kupac postoje u bazi i kad neki od tih podataka ne postoji u bazi. */ DECLARE @kupac xml SET @kupac = ' ' EXEC prUpisiKupac @kupac SET @kupac = ' ' EXEC prUpisiKupac @kupac CREATE OR ALTER PROC prUpisiKupac @xml xml AS BEGIN DECLARE @drzava_ident INT DECLARE @grad_ident INT IF NOT EXISTS( SELECT 1 FROM Drzava WHERE Naziv IN ( SELECT tbl.stupac.value('@Drzava', 'NVARCHAR(50)') FROM @xml.nodes('/Kupac') as tbl(stupac) ) ) BEGIN INSERT INTO Drzava(Naziv) SELECT tbl.stupac.value('@Drzava', 'NVARCHAR(50)') FROM @xml.nodes('/Kupac') as tbl(stupac) SET @drzava_ident = SCOPE_IDENTITY() END IF NOT EXISTS( SELECT 1 FROM Grad WHERE Naziv IN ( SELECT tbl.stupac.value('@Grad', 'NVARCHAR(50)') FROM @xml.nodes('/Kupac') as tbl(stupac) ) ) BEGIN INSERT INTO Grad(Naziv, DrzavaID) SELECT tbl.stupac.value('@Grad', 'NVARCHAR(50)'), @drzava_ident FROM @xml.nodes('/Kupac') as tbl(stupac) SET @grad_ident = SCOPE_IDENTITY() END IF NOT EXISTS( SELECT 1 FROM Kupac WHERE Ime + Prezime IN ( SELECT tbl.stupac.value('@Ime', 'NVARCHAR(50)') + tbl.stupac.value('@Prezime', 'NVARCHAR(50)') FROM @xml.nodes('/Kupac') as tbl(stupac) ) ) BEGIN INSERT INTO Kupac(Ime, Prezime, GradID) SELECT tbl.stupac.value('@Ime', 'NVARCHAR(50)'), tbl.stupac.value('@Prezime', 'NVARCHAR(50)'), @grad_ident FROM @xml.nodes('/Kupac') as tbl(stupac) END END DROP PROC prUpisiKupac --Ishod 5-- --Zad 1-- /* Napi�ite proceduru s jednim parametrom IDKupac koja bri�e zadanog kupca, sve ra�une koje je on napravio i stavke tih ra�una. U transakciji izvan procedure pozovite proceduru 3 puta s 3 razli�ita podatka IDKupac. Ispi�ite uspjeh ili neuspjeh cijele operacije. Napravite poziv procedure kojim prikazujete primjer uspje�nog brisanja podataka. */ CREATE OR ALTER PROC brisiKupca @IDKupac int AS BEGIN DELETE FROM Stavka WHERE RacunID IN ( SELECT IDRacun FROM Racun WHERE KupacID = @IDKupac ) DELETE FROM Racun WHERE KupacID = @IDKupac DELETE FROM Kupac WHERE IDKupac = @IDKupac END BEGIN TRAN BEGIN TRY EXEC brisiKupca @IDKupac = 2 EXEC brisiKupca @IDKupac = 4 EXEC brisiKupca @IDKupac = 5 COMMIT TRAN PRINT('Uspjeh') END TRY BEGIN CATCH ROLLBACK TRAN PRINT('Gre�ka') END CATCH --Zad 2-- /* Opi�ite i na tablici Proizvod demonstrirajte kako nastaje problem fantoma. Nazna�ite u kojem se to�no dijelu problem pojavljuje i na koji na�in i gdje ste ga rije�ili. */ /* Problem fantoma se pojavljuje kada prva transakcija �ita tablicu dva puta, no u me�uvremenu druga transakcija unese novi podatak Tada prva transakcija na drugom �itanju dobiva druga�ije podatke od prvog �itanja, to jest dobiva n + 1 redaka */ BEGIN TRAN SELECT * FROM Proizvod INSERT INTO Proizvod(Naziv, BrojProizvoda, MinimalnaKolicinaNaSkladistu, CijenaBezPDV) VALUES ('Red Sunglasses', 'PR-123', 23, 9.99) SELECT * FROM Proizvod COMMIT TRAN /* Problem se rje�ava dodavanjem: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE Koji spre�ava dodavanje podataka druge transakcije dok ne zavr�i prva transakcija */ --Zad 3-- /* Napi�ite proceduru s jednim ulaznim parametrom IDRacun koja u transakciji a�urira stupac Komentar poslanog ra�una i u njega upisuje �Provjeriti�. Pozovite proceduru dva puta s dva razli�ita podatka IDRacun: u jednom pozivu neka bude stvarni ra�un, a u drugom pozivu po�aljite nepostoje�i IDRacun). Ispi�ite uspjeh ili neuspjeh cijele operacije. */ CREATE OR ALTER PROC promijeniKomentar @IDRacun int AS BEGIN BEGIN TRAN BEGIN TRY UPDATE Racun SET Komentar = 'Provjeriti' WHERE IDRacun = @IDRacun COMMIT TRAN END TRY BEGIN CATCH ROLLBACK TRAN END CATCH END EXEC promijeniKomentar @IDRacun = 43659 EXEC promijeniKomentar @IDRacun = 2 IF @@ERROR = 0 BEGIN PRINT ('Uspjeh') END ELSE BEGIN PRINT ('Neuspjeh') END --Ishod 6-- --Zad 1-- /* Napi�ite jedan upit za prikaz koliko kreiranih ra�una ima pojedini komercijalist (prika�ite ime i prezime komercijaliste). Rezultate treba rangirati s nekom od funkcija (po izboru) kako bi na vrhu bili komercijalisti s najvi�e izdanih ra�una. */ SELECT k.Ime, k.Prezime, COUNT(r.IDRacun) as IzdaniRacuni, RANK() OVER (ORDER BY COUNT(r.IDRacun) DESC) as Rang FROM Komercijalist as k INNER JOIN Racun as r ON r.KomercijalistID = k.IDKomercijalist GROUP BY k.Ime, k.Prezime --Zad 2-- /* Napi�ite upit za prikaz naziva proizvoda i minimalnih koli�ina na skladi�tu, sortirano padaju�e po minimalnim koli�inama na skladi�tu. Neka u dodatnom stupcu bude prikazan prosje�ni iznos minimalne koli�ine na skladi�tu uklju�uju�i trenutni redak, 5 prethodnih redaka i 5 sljede�ih redaka. */ SELECT p.Naziv, p.MinimalnaKolicinaNaSkladistu, AVG(p.MinimalnaKolicinaNaSkladistu) OVER (PARTITION BY p.Naziv) as prosjek FROM Proizvod as p ORDER BY MinimalnaKolicinaNaSkladistu DESC --Zad 3-- /* Napi�ite jedan upit za izra�unavanje ukupnog iznosa prodane robe (SUM(Stavka.UkupnaCijena)) po gradovima (prika�ite nazive gradova) i tipovima kreditnih kartica kojima su pla�ani ra�uni. Treba biti vidljivo i koliki je ukupan iznos prodane robe u pojedinom gradu (za sve tipove kreditnih kartica) te grand total. */ SELECT g.Naziv, kk.Tip, SUM(s.UkupnaCijena) FROM Stavka as s INNER JOIN Racun as r on r.IDRacun = s.RacunID INNER JOIN KreditnaKartica as kk on kk.IDKreditnaKartica = r.KreditnaKarticaID INNER JOIN Kupac as k on k.IDKupac = r.KupacID INNER JOIN Grad as g on g.IDGrad = k.GradID GROUP BY ROLLUP(g.Naziv, kk.Tip) --Ishod 7-- /* --Zad 1 --Kreirajte novu bazu podataka proizvoljnog naziva i u njoj novu kolekciju naziva Prijatelji. const baza = 'OBP'; use(baza); db.createCollection('Prijatelji'); --Zad 2 --Upi�ite sebe i svog najboljeg prijatelja u novu kolekciju: upi�ite imena, prezimena i komentar. db.getCollection('Prijatelji').insertMany( [ { "Ime": "Luka", "Prezime": "Markota", "Komentar": "test" }, { "Ime": "John", "Prezime": "Doe", "Komentar": "Najjaci" } ] ); --Zad 3 --Napi�ite upit za a�uriranje Va�eg dokumenta iz kolekcije Prijatelji promjenom komentara u �Provjeriti�. db.getCollection('Prijatelji').updateOne( {"Komentar": "test"}, { $set: {"Komentar": "provjeriti"} } ); --Zad 4 --Napi�ite upit kojim �ete iz kolekcije Prijatelji obrisati dokument s podacima o vama. db.getCollection('Prijatelji').deleteOne( {"Ime": "Luka"} ); */