Advertisement
Guest User

Untitled

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