Advertisement
dzindara

Untitled

Jan 16th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --------------------------------------------------------------------------------
  2. -- 2. Zadatak
  3. --------------------------------------------------------------------------------
  4. CREATE TABLE Proizvodac ( Proizvodac INTEGER NOT NULL,
  5.                           Naziv_proizvodaca VARCHAR(50),
  6.                           Grad VARCHAR(50),
  7.                           Adresa VARCHAR(50),
  8.                           Web_adresa VARCHAR(50),
  9.                           Status VARCHAR(50) NOT NULL,
  10.  
  11. CONSTRAINT c_Proizvodac_Proizvodac_PK PRIMARY KEY (Proizvodac),
  12. CONSTRAINT c_Proizvodac_Status_CK CHECK (Status IN ('Ovlasten','Neovlasten'))  ); -- Ovo nije obavezno, ali ako se bude tražilo da STATUS može imati samo određene vrijednosti
  13.  
  14. CREATE TABLE FiskalniUredaj ( FiskalniUredaj INTEGER NOT NULL,
  15.                               Vrsta_fiskalnog_uredaja INTEGER NOT NULL,
  16.                               Serijski_broj_uredaja VARCHAR(50),
  17.                               Cijena NUMBER,
  18.                               Datum_servisiranja DATE,
  19.  
  20. CONSTRAINT c_FiskalniUredaj_FiskalniUredaj_PK PRIMARY KEY (FiskalniUredaj),
  21. CONSTRAINT c_FiskalniUredaj_Vrsta_fiskalnog_uredaja_FK FOREIGN KEY (Vrsta_fiskalnog_uredaja) REFERENCES VrstaFiskalnogUredaja (VrstaFiskalnogUredaja) );
  22.  
  23. CREATE TABLE Serviser ( Serviser INTEGER NOT NULL,
  24.                         Servis INTEGER NOT NULL,
  25.                         Prezime VARCHAR(50),
  26.                         Ime VARCHAR(50),
  27.                         Telefon VARCHAR(50),
  28.                         Email VARCHAR(50),
  29.  
  30. CONSTRAINT c_Serviser_Serviser_PK PRIMARY KEY (Serviser),
  31. CONSTRAINT c_Serviser_Servis_FK FOREIGN KEY (Servis) REFERENCES Servis (Servis) );
  32.  
  33. CREATE TABLE Obveznik ( Obveznik INTEGER NOT NULL,
  34.                         Naziv INTEGER NOT NULL,
  35.                         Grad VARCHAR(50),
  36.                         Adresa VARCHAR(50),
  37.                         Telefon VARCHAR(50),
  38.                         WEB_adresa VARCHAR(50),
  39.                         Maticni_broj VARCHAR(50),
  40.  
  41. CONSTRAINT c_Obveznik_Obveznik_PK PRIMARY KEY (Obveznik) );
  42. --------------------------------------------------------------------------------
  43. -- 3. Zadatak
  44. --------------------------------------------------------------------------------
  45. SELECT p.Naziv_proizvodaca, vfu.Naziv, COUNT(fu.Uredaj), SUM(vfu.Cijena)
  46. FROM Proizvodac p, Vrsta_fiskalnog_uredaja vfu, Fiskalni_uredaj fu
  47. WHERE p.Proizvodac(+) = vfu.Proizvodac AND fu.Vrsta_uredaja(+) = vfu.Vrsta_uredaja
  48. GROUP BY ROLLUP(p.Naziv_proizvodaca, vfu.Naziv);
  49. --------------------------------------------------------------------------------
  50. -- 4. Zadatak
  51. --------------------------------------------------------------------------------
  52. CREATE INDEX serviser_UpperImePrezime_idx
  53. ON Serviser(UPPER(Ime || ' ' || Prezime));
  54.  
  55. CREATE ROLE fizika;
  56.  
  57. GRANT ALL PRIVILEGES TO fizika; -- Ovdje nije baš fino definisano šta se treba dozvoliti ulozi, ponovite dodjeljivanje prava na SELECT, DELETE itd.
  58.  
  59. CREATE USER Tazman
  60. IDENTIFIED BY Lozinka;
  61.  
  62. GRANT fizika TO Tazman;
  63. --------------------------------------------------------------------------------
  64. -- 5. Zadatak
  65. --------------------------------------------------------------------------------
  66. CREATE OR REPLACE PROCEDURE KorekcijaStatusaProizvodaca_Proc(SifraUredaja INTEGER) IS
  67. BEGIN
  68.  
  69.   START TRANSACTION;
  70.   UPDATE Proizvodac p
  71.   SET p.Status = ( SELECT f.Status
  72.                    FROM Fiskalizacija f, Fiskalni_uredaj fu
  73.                    WHERE f.FiskalniUredaj = fu.Uredaj AND fu.Uredaj = SifraUredaja AND
  74.                    Datum_fiskalizacije IN ( SELECT MAX(f1.Datum_fiskalizacije)
  75.                                             FROM Fiskalizacija f1 ));
  76.   COMMIT;
  77.  
  78. END;
  79. /
  80. --------------------------------------------------------------------------------
  81. -- 6. Zadatak
  82. --------------------------------------------------------------------------------
  83. CREATE OR REPLACE FUNCTION VratiStazInspektora_Func(uv_ImeInspektora IN Inspektor.Ime%TYPE, uv_PrezimeInspektora IN Inspektor.Prezime%TYPE)
  84. RETURN VARCHAR2 IS
  85.  
  86.    lv_BrojInspektora NUMBER := 0;
  87.    lv_Mjeseci NUMBER := 0;
  88.    lv_Poruka VARCHAR2(1000);
  89.  
  90.    CURSOR BrojZaposlenihKursor IS
  91.       SELECT COUNT(*)
  92.       FROM Inspektor
  93.       WHERE Ime = uv_ImeInspektora AND Prezime = uv_PrezimeInspektora;
  94.  
  95.    CURSOR StazKursor IS
  96.     SELECT DECODE( Datum_prestanka,
  97.     NOT NULL, MONTHS_BETWEEN(Datum_prestanka, Datum_zaposlenja),
  98.      MONTHS_BETWEEN(SYSDATE, Datum_zaposlenja))
  99.     FROM Inspektor
  100.     WHERE Ime = uv_ImeInspektora AND Prezime = uv_PrezimeInspektora;
  101.  
  102. BEGIN
  103.  
  104.    OPEN BrojZaposlenihKursor;
  105.    FETCH BrojZaposlenihKursor INTO lv_BrojInspektora;
  106.    CLOSE BrojZaposlenihKursor;
  107.  
  108.    IF lv_BrojInspektora > 1 THEN
  109.     lv_Poruka := 'Postoji više od jednog inspektora sa datim nazivom.';
  110.    ELSIF lv_BrojInspektora = 1 THEN
  111.     OPEN StazKursor;
  112.     FETCH StazKursor INTO lv_Mjeseci;
  113.     CLOSE StazKursor;
  114.     lv_Poruka := CONCAT(CONCAT(CONCAT('Godina:', TRUNC(lv_Mjeseci, 12)), ' i mjeseci:'), MOD(lv_Mjeseci, 12));
  115.    ELSE
  116.     lv_Poruka := 'Nepostojeći inspektor.';
  117.    END IF;
  118.  
  119.    RETURN (lv_Poruka);
  120.  
  121. END dajPrebivaliste;
  122. /
  123.  
  124. --------------------------------------------------------------------------------
  125. -- 7. Zadatak
  126. --------------------------------------------------------------------------------
  127. CREATE OR REPLACE VIEW PrikazFiskalizacije_View
  128. AS
  129. SELECT fu.Serijski_broj, f.Datum_fiskalizacije, s.Naziv, s.Grad, s.Adresa, sr.Telefon, sr.Email, AVG(fu.Cijena), COUNT(fu.Uredaj)
  130. FROM Fiskalni_uredaj fu, Fiskalizacija f, Servis s, Serviser sr, Vrsta_fiskalnog_uredaja vfu, Proizvodac p, Inspektor i
  131. WHERE fu.Uredaj = f.FiskalniUredaj AND f.Serviser = sr.Serviser AND sr.Servis = s.Servis AND fu.Vrsta_uredaja = vfu.VrstaUredaja AND vfu.Proizvodac = p.Proizvodac AND f.Inspektor = i.Inspektor AND
  132.       ((fu.Datum_servisiranja < i.Datum_zaposlenja AND p.Grad = s.Grad) OR
  133.       (fu.Datum_servisiranja > i.Datum_zaposlenja AND ( SELECT COUNT(vfu1.VrstaUredaja)
  134.                                                         FROM Vrsta_fiskalnog_uredaja vfu1
  135.                                                         WHERE vfu1.VrstaUredaja = fu.VrstaUredaja AND
  136.                                                               vfu1.Proizvodac = p.Proizvodac AND
  137.                                                               fu.Datum_servisiranja BETWEEN i.Datum_zapolsenja AND SYSDATE ) > ( SELECT COUNT(fu1.Datum_servisiranja)
  138.                                                                                                                                  FROM Fiskalni_uredaj fu1
  139.                                                                                                                                  WHERE fu1.Uredaj = fu.Uredaj ) ) )
  140. GROUP BY fu.Serijski_broj, f.Datum_fiskalizacije, s.Naziv, s.Grad, s.Adresa, sr.Telefon, sr.Email
  141. HAVING COUNT(fu.Uredaj) > ( SELECT AVG(COUNT(fu.Uredaj))
  142.                             FROM Fiskalni_uredaj fu, Proizvodac p
  143.                             WHERE ROWNUM <= 5
  144.                             ORDER BY COUNT(fu.Uredaj) DESC; ) -- Za najveće proizvođače uzimam one koji imaju najveći broj uređaja
  145.  
  146. -- S obzirom da je ovaj zadatak dosta glomazan i konfuzan, ne mogu garantovati za ispravnost, ali možete shvatiti logiku kojom se trebate voditi prilikom
  147. -- izrade ovako teških zadataka
  148. --------------------------------------------------------------------------------
  149. -- 8. Zadatak
  150. --------------------------------------------------------------------------------
  151. CREATE OR REPLACE TRIGGER KontrolaFiskalizacije_Trig
  152. BEFORE INSERT ON Fiskalizacija
  153. FOR EACH ROW
  154.  
  155.   lv_gradObveznika VARCHAR2(50);
  156.   lv_gradServisa VARCHAR2(50);
  157.   lv_gradInspektora VARCHAR2(50);
  158.   lv_Proizvodac INTEGER;
  159.   lv_statusProizvodaca VARCHAR2(50);
  160.  
  161. BEGIN
  162.  
  163.   SELECT o.Grad
  164.   INTO lv_gradObveznika
  165.   FROM Obveznik o
  166.   WHERE o.Obveznik = :NEW.Obveznik;
  167.  
  168.   SELECT s.Grad
  169.   INTO lv_gradServisa
  170.   FROM Servis s, Serviser sr
  171.   WHERE sr.Servis = s.Servis AND sr.Serviser = :NEW.Serviser;
  172.  
  173.   SELECT i.Grad
  174.   INTO lv_gradInspektora
  175.   FROM Inspektor i
  176.   WHERE i.Inspektor = :NEW.Inspektor;
  177.  
  178.   IF lv_gradObveznika <> lv_gradServisa OR lv_gradObveznika <> lv_gradInspektora OR lv_gradInspektora <> lv_gradServisa THEN
  179.     SELECT p.Proizvodac, p.Status
  180.     INTO lv_Proizvodac, lv_statusProizvodaca
  181.     FROM Proizvodac p, Servis s, Serviser sr
  182.     WHERE s.Proizvodac = p.Proizvodac AND sr.Servis = s.Servis AND sr.Serviser = :NEW.Serviser;
  183.  
  184.     IF lv_statusProizvodaca = :NEW.Status THEN
  185.       UPDATE Fiskalni_uredaj fu SET fu.Cijena = ( SELECT vfu.Cijena
  186.                                                   FROM Vrsta_fisalnog_uredaja vfu
  187.                                                   WHERE  vfu.Proizvodac = lv_Proizvodac );
  188.     ELSE
  189.       Raise_Application_Error(-20500, 'Grad obveznika, servisa i inspektora, kao i statusi proizvođača i fiskalizacije nisu isti.');
  190.     END IF;
  191.   END IF;
  192.  
  193. END;
  194. /
  195. --------------------------------------------------------------------------------
  196. -- Korisne napomene :
  197. --------------------------------------------------------------------------------
  198. -- 1. Ponovite SET operatore, dakle UNION, UNION ALL, INTERSECT i MINUS
  199. -- 2. Ponovite Hijerarhijsku strukturu podataka, dakle TOP DOWN i BOTTOM UP
  200. --    kreiranje drveća, često se desi da takvi zadaci dođu na ispitu i iako nisu
  201. --    teški nemogu se uraditi jer se to predavanje nije ni pročitalo
  202. -- 3. Funkcije i Procedure nisu toliko puno obrađivane u materijalima pa vam je
  203. --    najbolje da to direktno naučite iz Oracle dokumentacije :
  204. --    Procedure: http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6009.htm
  205. --    Funkcije: http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5009.htm
  206. -- 4. Obavezno ponoviti kreiranje top 10 analize
  207. -- 5. Cheers m8s !
  208. --------------------------------------------------------------------------------
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  SELECT
  286.  FROM employees e
  287.  WHERE e.first_name LIKE 'Steven' AND last_name LIKE 'King';
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement