Advertisement
Guest User

Untitled

a guest
Dec 19th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE TRIGGER wyzwalacz
  2. BEFORE INSERT ON Bandy
  3. FOR EACH ROW
  4. BEGIN
  5. SELECT MAX(nr_bandy)+1 INTO :NEW.nr_bandy FROM Bandy;
  6. END;
  7.  
  8. SET AUTOCOMMIT OFF;
  9.  
  10. BEGIN nowa_banda(41, 'nowaBanda' , 'wysypisko');
  11. END;
  12.  
  13. SELECT nr_bandy FROM Bandy WHERE nazwa= 'nowaBanda';
  14.  
  15. ROLLBACK;
  16.  
  17. --42)
  18. SET AUTOCOMMIT OFF;
  19.  
  20. CREATE OR REPLACE PACKAGE Podwyzka AS
  21. przydzial NUMBER DEFAULT 0;
  22. nagroda NUMBER DEFAULT 0;
  23. kara NUMBER DEFAULT 0;
  24. END Podwyzka;
  25.  
  26. CREATE OR REPLACE TRIGGER przydzial_tygrysa
  27. BEFORE UPDATE ON Kocury
  28. BEGIN
  29. SELECT przydzial_myszy INTO Podwyzka.przydzial FROM Kocury WHERE pseudo='TYGRYS';
  30. END;
  31.  
  32. CREATE OR REPLACE TRIGGER Nowy_przydzial
  33. BEFORE UPDATE ON Kocury
  34. FOR EACH ROW
  35. DECLARE
  36.  max_m NUMBER DEFAULT 0;
  37.  przydzial_m NUMBER DEFAULT 0;
  38. BEGIN
  39.  SELECT max_myszy INTO max_m
  40.  FROM Funkcje WHERE funkcja =:NEW.funkcja;
  41.  
  42.  IF :NEW.funkcja = 'MILUSIA' THEN
  43.     IF :NEW.przydzial_myszy < :OLD.przydzial_myszy THEN
  44.         :NEW.przydzial_myszy := :OLD.przydzial_myszy;
  45.         DBMS_OUTPUT.PUT_LINE('BLOKADA obnizania przydzialu kota ' || :NEW.pseudo);
  46.     END IF;
  47.     przydzial_m := :NEW.przydzial_myszy - :OLD.przydzial_myszy;
  48.     IF(przydzial_m < 0.1*Podwyzka.przydzial) AND (przydzial_m >0) THEN
  49.         DBMS_OUTPUT.PUT_LINE('KARA dla Tygrysa ');
  50.         Podwyzka.kara := Podwyzka.kara + 1;
  51.         :NEW.przydzial_myszy := :NEW.przydzial_myszy + Podwyzka.przydzial*0.1;
  52.         :NEW.myszy_extra := :NEW.myszy_extra +5;
  53.     ELSIF (przydzial_m < 0.1*Podwyzka.przydzial) AND (przydzial_m>0) THEN
  54.         DBMS_OUTPUT.PUT_LINE('NAGRODA dla Tygrysa ');
  55.         Podwyzka.nagroda := Podwyzka.nagroda+1;
  56.     END IF;
  57.  END IF;
  58.  
  59.  IF :NEW.przydzial_myszy > max_m THEN
  60.     :NEW.przydzial_myszy := max_m;
  61.  END IF;
  62. END;
  63.    
  64. CREATE OR REPLACE TRIGGER Rozliczenie_Tygrysa
  65. AFTER UPDATE ON Kocury
  66. DECLARE
  67.  n NUMBER DEFAULT 0;
  68. BEGIN
  69.     IF Podwyzka.kara > 0 THEN
  70.         n := Podwyzka.kara;
  71.         Podwyzka.kara := 0;
  72.         UPDATE Kocury SET
  73.         przydzial_myszy = przydzial_myszy -((0.1*n)*przydzial_myszy)
  74.         WHERE pseudo = 'TYGRYS';
  75.     END IF;
  76.     IF Podwyzka.nagroda>0 THEN
  77.         n := Podwyzka.nagroda;
  78.         Podwyzka.nagroda :=0;
  79.         UPDATE Kocury SET
  80.         myszy_extra = myszy_extra+(n*5)
  81.         WHERE pseudo = 'TYGRYS';
  82.     END IF;
  83. END;
  84.  
  85. SELECT *  FROM Kocury;
  86. UPDATE Kocury SET przydzial_myszy = przydzial_myszy +1 ;
  87. ROLLBACK;
  88.  
  89. --42b)
  90.  
  91. CREATE OR REPLACE TRIGGER Podwyzka_wyzwalacz
  92. FOR UPDATE ON  Kocury
  93. COMPOUND TRIGGER
  94.     przydzial NUMBER DEFAULT 0;
  95.     nagroda NUMBER DEFAULT 0;
  96.     kara NUMBER DEFAULT 0;
  97.     max_m NUMBER DEFAULT 0;
  98.     przydzial_m NUMBER DEFAULT 0;
  99.     n NUMBER DEFAULT 0;
  100. BEFORE STATEMENT IS BEGIN
  101.     SELECT przydzial_myszy INTO przydzial FROM Kocury WHERE pseudo='TYGRYS';
  102. END BEFORE STATEMENT;
  103.  
  104. BEFORE EACH ROW IS BEGIN
  105.     SELECT max_myszy INTO max_m
  106.     FROM Funkcje WHERE funkcja =:NEW.funkcja;
  107.  
  108.     IF :NEW.funkcja = 'MILUSIA' THEN
  109.         IF :NEW.przydzial_myszy < :OLD.przydzial_myszy THEN
  110.             :NEW.przydzial_myszy := :OLD.przydzial_myszy;
  111.             DBMS_OUTPUT.PUT_LINE('BLOKADA obnizania przydzialu kota ' || :NEW.pseudo);
  112.         END IF;
  113.         przydzial_m := :NEW.przydzial_myszy - :OLD.przydzial_myszy;
  114.         IF(przydzial_m < 0.1*przydzial) AND (przydzial_m >0) THEN
  115.             DBMS_OUTPUT.PUT_LINE('KARA dla Tygrysa ');
  116.             kara := kara + 1;
  117.             :NEW.przydzial_myszy := :NEW.przydzial_myszy + przydzial*0.1;
  118.             :NEW.myszy_extra := :NEW.myszy_extra +5;
  119.         ELSIF (przydzial_m < 0.1*przydzial) AND (przydzial_m>0) THEN
  120.             DBMS_OUTPUT.PUT_LINE('NAGRODA dla Tygrysa ');
  121.             nagroda := nagroda+1;
  122.         END IF;
  123.     END IF;
  124.  
  125.     IF :NEW.przydzial_myszy > max_m THEN
  126.         :NEW.przydzial_myszy := max_m;
  127.     END IF;
  128. END BEFORE EACH ROW;
  129.  
  130. AFTER STATEMENT IS BEGIN
  131.     IF kara > 0 THEN
  132.         n := kara;
  133.         kara := 0;
  134.         UPDATE Kocury SET
  135.         przydzial_myszy = przydzial_myszy -((0.1*n)*przydzial_myszy)
  136.         WHERE pseudo = 'TYGRYS';
  137.     END IF;
  138.     IF nagroda>0 THEN
  139.         n := nagroda;
  140.         nagroda :=0;
  141.         UPDATE Kocury SET
  142.         myszy_extra = myszy_extra+(n*5)
  143.         WHERE pseudo = 'TYGRYS';
  144.     END IF;
  145. END AFTER STATEMENT;
  146. END Podwyzka_wyzwalacz;
  147.    
  148.  
  149. SELECT * FROM Kocury;
  150. UPDATE Kocury SET przydzial_myszy = przydzial_myszy + 5;
  151. SELECT * FROM Kocury;
  152. ROLLBACK;
  153.  
  154. --43)
  155.  
  156. SET SERVEROUTPUT ON;
  157.  
  158. DECLARE
  159.     CURSOR kursorFunkcji IS
  160.         SELECT DISTINCT Funkcje.funkcja
  161.         FROM Kocury
  162.         LEFT JOIN Funkcje ON Kocury.funkcja= Funkcje.funkcja;
  163.     CURSOR kursorBand IS
  164.         SELECT DISTINCT Bandy.nr_bandy , Bandy.nazwa
  165.         FROM Kocury
  166.         LEFT JOIN Bandy ON Kocury.nr_bandy = Bandy.nr_bandy;
  167.     CURSOR kursorKocurow IS
  168.         SELECT * FROM Kocury;
  169.     plecc Kocury.plec%TYPE;
  170.     ile NUMBER DEFAULT 0;
  171. BEGIN
  172.     DBMS_OUTPUT.PUT(RPAD('NAZWA BANDY ',16) || RPAD('PLEC',10) || 'ILE ' );
  173.     FOR funk IN kursorFunkcji LOOP
  174.         DBMS_OUTPUT.PUT(LPAD(funk.funkcja,10) || ' ');
  175.     END LOOP;
  176.     DBMS_OUTPUT.PUT_LINE(LPAD('SUMA',5));
  177.     FOR banda IN kursorBand LOOP
  178.     DBMS_OUTPUT.PUT(RPAD(banda.nazwa,15)|| ' ');
  179.         FOR i IN 1..2 LOOP
  180.             IF i = 1 THEN
  181.                 plecc := 'D';
  182.                 DBMS_OUTPUT.PUT(RPAD('Kotka',11));
  183.             ELSE
  184.                 plecc := 'M';
  185.                 DBMS_OUTPUT.PUT(RPAD(' ',16));
  186.                 DBMS_OUTPUT.PUT(RPAD('Kocur',11));
  187.             END IF;
  188.             ile:=0;
  189.             FOR kot IN kursorKocurow LOOP    
  190.                      IF kot.nr_bandy = banda.nr_bandy AND kot.plec =plecc  THEN
  191.                      ile := ile + 1;                                  
  192.                 END IF;
  193.             END LOOP;
  194.             DBMS_OUTPUT.PUT(ile ||' ');
  195.             FOR funk IN kursorFunkcji LOOP
  196.                 SELECT SUM(CASE WHEN Kocury.funkcja = funk.funkcja THEN NVL(przydzial_myszy,0)+NVL(myszy_extra,0)
  197.                 ELSE 0
  198.                 END ) INTO ile
  199.                     FROM Kocury
  200.                     WHERE Kocury.nr_bandy = banda.nr_bandy AND Kocury.plec = plecc;
  201.                 DBMS_OUTPUT.PUT(LPAD(ile, 10) || ' ');
  202.             END LOOP;
  203.                 ile := 0;
  204.                 FOR kot IN kursorKocurow LOOP    
  205.                      IF kot.nr_bandy = banda.nr_bandy AND kot.plec = plecc THEN
  206.                      ile := ile + NVL(kot.przydzial_myszy , 0) + NVL(kot.myszy_extra,0);                                  
  207.                 END IF;
  208.                 END LOOP;
  209.                 DBMS_OUTPUT.PUT(LPAD(ile,6) || ' ');
  210.                 DBMS_OUTPUT.PUT_LINE(' ');
  211.             END LOOP;
  212.         END LOOP;
  213.          DBMS_OUTPUT.PUT(RPAD('ZJADA RAZEM ',15));
  214.          DBMS_OUTPUT.PUT(RPAD(' ', 14));
  215.          FOR funk IN kursorFunkcji LOOP
  216.             ile := 0;
  217.              FOR kot IN kursorKocurow LOOP    
  218.                      IF kot.funkcja = funk.funkcja  THEN
  219.                      ile := ile + NVL(kot.przydzial_myszy , 0) + NVL(kot.myszy_extra,0);                                  
  220.                 END IF;
  221.                 END LOOP;
  222.                 DBMS_OUTPUT.PUT(LPAD(ile,10) || ' ');
  223.         END LOOP;  
  224.         ile := 0;
  225.         FOR kot IN kursorKocurow LOOP    
  226.             ile := ile + NVL(kot.przydzial_myszy , 0) + NVL(kot.myszy_extra,0);                                  
  227.         END LOOP;
  228.             DBMS_OUTPUT.PUT(LPAD(ile,6) || ' ');
  229.                
  230.         DBMS_OUTPUT.PUT_LINE(' ');                      
  231. END;
  232.  
  233. --44)
  234. SET AUTOCOMMIT OFF;
  235.  
  236.  
  237. CREATE OR REPLACE PACKAGE podatek_kocurow AS
  238.     PROCEDURE nowa_banda(
  239.         numer_bandy Bandy.nr_bandy%TYPE,
  240.         nazwa_bandy Bandy.nazwa%TYPE,
  241.         teren_polowan Bandy.teren%TYPE);
  242.     FUNCTION podatek_kota(
  243.     pseudo_kota Kocury.pseudo%TYPE)
  244.     RETURN NUMBER;
  245. END podatek_kocurow;
  246.  
  247. CREATE OR REPLACE PACKAGE BODY podatek_kocurow AS
  248.     PROCEDURE nowa_banda(
  249.     numer_bandy bandy.nr_bandy%TYPE,
  250.     nazwa_bandy bandy.nazwa%TYPE,
  251.     teren_polowan bandy.teren%TYPE)
  252.     AS
  253.     ZLY_NUMER EXCEPTION;
  254.     ZLA_WARTOSC EXCEPTION;
  255.     blad STRING(256);
  256.     ilosc NUMBER DEFAULT 0;
  257.     BEGIN
  258.      IF numer_bandy<=0 THEN
  259.       RAISE ZLY_NUMER;
  260.      END IF;
  261.      SELECT COUNT(nr_bandy) INTO ilosc FROM Bandy WHERE nr_bandy= numer_bandy;
  262.      IF ilosc > 0 THEN
  263.         blad := TO_CHAR(numer_bandy);
  264.      END IF;
  265.      SELECT COUNT(nazwa_bandy) INTO ilosc FROM Bandy WHERE Bandy.nazwa = nazwa_bandy;
  266.      IF ilosc >0 THEN
  267.         blad := blad||', '||nazwa_bandy;
  268.      END IF;
  269.      SELECT COUNT(teren) INTO ilosc FROM Bandy WHERE Bandy.teren = teren_polowan;
  270.      IF ilosc>0 THEN
  271.         blad := blad||', '||teren_polowan;
  272.      END IF;
  273.       IF LENGTH(blad) > 0 THEN
  274.         RAISE ZLA_WARTOSC;
  275.       END IF;
  276.      
  277.      INSERT INTO Bandy( nr_bandy, nazwa, teren)
  278.      VALUES (numer_bandy, nazwa_bandy, teren_polowan);
  279.      EXCEPTION
  280.       WHEN ZLY_NUMER THEN DBMS_OUTPUT.PUT_LINE('Wrowadzono blędny numer mniejszy od 1!!');  
  281.       WHEN ZLA_WARTOSC THEN DBMS_OUTPUT.PUT_LINE(blad||': juz istnieje');
  282.      
  283.     END;
  284.  
  285.     FUNCTION podatek_kota(
  286.     pseudo_kota Kocury.pseudo%TYPE)
  287.     RETURN NUMBER IS
  288.     licznik NUMBER DEFAULT 0;
  289.     podatek NUMBER DEFAULT 0;
  290.     BEGIN
  291.         SELECT CEIL((NVL(przydzial_myszy,1)+NVL(myszy_extra,1))*0.05) INTO podatek
  292.         FROM Kocury WHERE pseudo = pseudo_kota;
  293.        
  294.         SELECT COUNT(pseudo) INTO licznik
  295.         FROM Kocury WHERE szef = pseudo_kota;
  296.         IF licznik = 0 THEN
  297.             podatek := podatek + 2;
  298.         END IF;
  299.        
  300.         SELECT COUNT(pseudo) INTO licznik
  301.         FROM wrogowie_kocurow WHERE pseudo  = pseudo_kota;
  302.         IF licznik = 0 THEN
  303.            podatek := podatek + 1;
  304.         END IF;
  305.        
  306.         SELECT COUNT(pseudo) INTO licznik
  307.         FROM Kocury WHERE  pseudo=pseudo_kota AND przydzial_myszy > 50;
  308.         IF licznik > 0 THEN
  309.         podatek := podatek + 8;
  310.         END IF;
  311.         RETURN podatek;
  312.     END podatek_kota;
  313. END podatek_kocurow;
  314.  
  315. SELECT pseudo , podatek_kocurow.podatek_kota(pseudo) "Podatek" FROM Kocury ;
  316.  
  317. --45)
  318.  
  319. CREATE TABLE Dodatki_extra(
  320.     id_dodatku NUMBER(2) GENERATED BY DEFAULT ON NULL AS IDENTITY CONSTRAINT id_pk PRIMARY KEY,
  321.     pseudo VARCHAR2(15),
  322.     dodatek_extra NUMBER(3) NOT NULL
  323. );
  324. DROP TABLE Dodatki_extra;
  325. CREATE OR REPLACE TRIGGER blokada_Tygrysa
  326. AFTER UPDATE OF przydzial_myszy ON Kocury
  327. FOR EACH ROW
  328. DECLARE
  329.   PRAGMA AUTONOMOUS_TRANSACTION;
  330. BEGIN
  331.   IF  :NEW.przydzial_myszy > :old.przydzial_myszy
  332.   AND :NEW.funkcja = 'MILUSIA'
  333.   AND LOGIN_USER != 'TYGRYS' THEN
  334.     EXECUTE IMMEDIATE '
  335.      DECLARE
  336.        CURSOR kursorMilusie IS
  337.          SELECT pseudo FROM Kocury WHERE funkcja = ''MILUSIA'';
  338.      BEGIN
  339.        FOR kot IN kursorMilusie LOOP
  340.          INSERT INTO dodatki_extra(pseudo, dodatek_extra)
  341.          VALUES (kot.pseudo, -10);
  342.        END LOOP;
  343.      END;';
  344.     COMMIT;
  345.   END IF;
  346. END;
  347.  
  348. SELECT * FROM dodatki_extra;
  349. UPDATE Kocury SET przydzial_myszy = przydzial_myszy + 5;
  350. SELECT * FROM Kocury;
  351. ROLLBACK;
  352. DROP TRIGGER blokada_Tygrysa;
  353. DROP TABLE Dodatki_extra;
  354.  
  355. --46)
  356.  
  357. CREATE TABLE Monitor(
  358. id_proby NUMBER(2) GENERATED BY DEFAULT ON NULL AS IDENTITY CONSTRAINT id_pk PRIMARY KEY,
  359.     pseudo_wprowadzajacego VARCHAR2(15),
  360.     data_zmiany DATE DEFAULT SYSDATE,
  361.     pseudo VARCHAR2(15),
  362.     transakcja VARCHAR2(8)
  363. ) ;
  364.  
  365. DROP TABLE Monitor;
  366. DROP TRIGGER blokada_przydzialu;
  367. CREATE OR REPLACE TRIGGER blokada_przydzialu
  368. BEFORE UPDATE OF przydzial_myszy OR INSERT ON Kocury
  369. FOR EACH ROW
  370. DECLARE
  371.     max_m Funkcje.max_myszy%TYPE;
  372.     min_m Funkcje.min_myszy%TYPE;
  373.     login Monitor.pseudo_wprowadzajacego%TYPE;
  374.     dat  Monitor.data_Zmiany%TYPE;
  375.     pseudo Kocury.pseudo%TYPE;
  376.     trans VARCHAR2(8);
  377.     PRAGMA AUTONOMOUS_TRANSACTION;
  378. BEGIN
  379. CASE
  380. WHEN inserting THEN trans:='INSERT';
  381. WHEN updating THEN trans:='UPDATE';
  382. END CASE;
  383.     login := LOGIN_USER;
  384.     dat :=SYSDATE;
  385.     SELECT max_myszy INTO max_m
  386.     FROM Funkcje WHERE :NEW.funkcja = Funkcje.funkcja;
  387.     SELECT min_myszy INTO min_m
  388.     FROM Funkcje WHERE :NEW.funkcja = Funkcje.funkcja;
  389.    
  390.     IF :NEW.przydzial_myszy > max_m OR  :NEW.przydzial_myszy < min_m THEN
  391.         :NEW.przydzial_myszy := :OLD.przydzial_myszy;
  392.         pseudo := :NEW.pseudo;
  393.         INSERT INTO Monitor(pseudo_wprowadzajacego, data_zmiany, pseudo, transakcja)
  394.         VALUES(login,dat,pseudo, trans);
  395.         DBMS_OUTPUT.PUT('ZAKAZ !!!');
  396.        
  397.     END IF;
  398.  
  399. END;
  400.  
  401. SELECT * FROM Monitor;
  402. UPDATE Kocury SET przydzial_myszy = przydzial_myszy + 10 WHERE pseudo = 'PLACEK';  
  403. ROLLBACK;
  404. SELECT * FROM Kocury;
  405. SET AUTOCOMMIT OFF;
  406. SET SERVEROUTPUT ON;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement