Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Zad 42
- --A
- --pakiet
- CREATE OR REPLACE PACKAGE Zad42 AS
- przydzial NUMBER DEFAULT 0;
- kara NUMBER DEFAULT 0;
- nagroda NUMBER DEFAULT 0;
- END Zad42;
- --wyzwalacz: przed updatem zapisz przydzial tygrysa do pakietu
- CREATE OR REPLACE TRIGGER Zad42_BeforeUpdate
- BEFORE UPDATE ON kocury
- BEGIN
- SELECT przydzial_myszy INTO Zad42.przydzial FROM Kocury WHERE pseudo = 'TYGRYS';
- END;
- --wyzwalacz dla kazdego wiersza przed update
- CREATE OR REPLACE TRIGGER Zad42_BeforeUpdateEachRow
- BEFORE UPDATE ON Kocury
- FOR EACH ROW
- DECLARE
- f_min NUMBER DEFAULT 0;
- f_max NUMBER DEFAULT 0;
- diff NUMBER DEFAULT 0;
- BEGIN
- SELECT min_myszy, max_myszy INTO f_min, f_max FROM Funkcje WHERE funkcja = :new.funkcja;
- IF :new.funkcja = 'MILUSIA' THEN
- IF :new.przydzial_myszy < :old.przydzial_myszy THEN
- :new.przydzial_myszy := :old.przydzial_myszy;
- DBMS_OUTPUT.PUT_LINE('Zablokowano probe obnizki kota ' || :new.pseudo
- || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
- END IF;
- diff := :new.przydzial_myszy - :old.przydzial_myszy;
- IF (diff > 0) AND (diff < 0.1 * Zad42.przydzial) THEN
- DBMS_OUTPUT.PUT_LINE('Kara dla Tygrysa za zmiane dla kota ' || :new.pseudo
- || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
- Zad42.kara := Zad42.kara + 1;
- :new.przydzial_myszy := :new.przydzial_myszy + 0.1 * Zad42.przydzial;
- :new.myszy_extra := :new.myszy_extra + 5;
- ELSIF (diff > 0) AND (diff >= 0.1 * Zad42.przydzial) THEN
- DBMS_OUTPUT.PUT_LINE('Nagroda dla Tygrysa za zmiane dla kota ' || :new.pseudo
- || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
- Zad42.nagroda := Zad42.nagroda + 1;
- END IF;
- END IF;
- -- Sprawdzanie przekroczenia wartosci dla funkcji:
- IF :new.przydzial_myszy < f_min THEN
- :new.przydzial_myszy := f_min;
- ELSIF :new.przydzial_myszy > f_max THEN
- :new.przydzial_myszy := f_max;
- END IF;
- END;
- --wyzwalacz po update gdy nagroda lub kara jest > 0 odp obniz przydzial tygrysa lub zwieksz
- CREATE OR REPLACE TRIGGER Zad42_AfterUpdate
- AFTER UPDATE ON Kocury
- DECLARE
- tmp NUMBER DEFAULT 0;
- BEGIN
- IF Zad42.kara > 0 THEN
- tmp := Zad42.kara;
- Zad42.kara := 0;
- UPDATE Kocury SET przydzial_myszy = przydzial_myszy * ( 1 - (0.1 * tmp)) WHERE pseudo = 'TYGRYS';
- END IF;
- IF Zad42.nagroda > 0 THEN
- tmp := Zad42.nagroda;
- Zad42.nagroda := 0;
- UPDATE Kocury SET myszy_extra = myszy_extra + (Zad42.nagroda * 5) WHERE pseudo = 'TYGRYS';
- END IF;
- END;
- SHOW ERRORS;
- --test
- SELECT * FROM Kocury;
- UPDATE Kocury SET przydzial_myszy = przydzial_myszy + 1;
- SELECT * FROM Kocury;
- ROLLBACK;
- DROP TRIGGER Zad42_BeforeUpdate;
- DROP TRIGGER Zad42_BeforeUpdateEachRow;
- DROP TRIGGER Zad42_AfterUpdate;
- -- B
- CREATE OR REPLACE TRIGGER Zad42_CompoundTrigger
- FOR UPDATE ON Kocury
- COMPOUND TRIGGER
- przydzial NUMBER DEFAULT 0;
- kara NUMBER DEFAULT 0;
- nagroda NUMBER DEFAULT 0;
- BEFORE STATEMENT IS
- f_min NUMBER DEFAULT 0;
- f_max NUMBER DEFAULT 0;
- diff NUMBER DEFAULT 0;
- BEGIN
- SELECT przydzial_myszy INTO przydzial FROM Kocury WHERE pseudo = 'TYGRYS';
- END BEFORE STATEMENT;
- BEFORE EACH ROW IS BEGIN
- SELECT min_myszy, max_myszy INTO f_min, f_max
- FROM Funkcje WHERE funkcja = :new.funkcja;
- IF :new.funkcja = 'MILUSIA' THEN
- IF :new.przydzial_myszy < :old.przydzial_myszy THEN
- :new.przydzial_myszy := :old.przydzial_myszy;
- DBMS_OUTPUT.PUT_LINE('Zablokowano probe obnizki kota ' || :new.pseudo
- || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
- END IF;
- diff := :new.przydzial_myszy - :old.przydzial_myszy;
- IF (diff > 0) AND (diff < 0.1 * przydzial) THEN
- DBMS_OUTPUT.PUT_LINE('Kara dla Tygrysa za zmiane dla kota ' || :new.pseudo
- || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
- kara := kara + 1;
- :new.przydzial_myszy := :new.przydzial_myszy + 0.1 * przydzial;
- :new.myszy_extra := :new.myszy_extra + 5;
- ELSIF (diff > 0) AND (diff >= 0.1 * przydzial) THEN
- DBMS_OUTPUT.PUT_LINE('Nagroda dla Tygrysa za zmiane dla kota ' || :new.pseudo
- || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
- nagroda := nagroda + 1;
- END IF;
- END IF;
- -- Sprawdzanie przekroczenia wartosci dla funkcji:
- IF :new.przydzial_myszy < f_min THEN
- :new.przydzial_myszy := f_min;
- ELSIF :new.przydzial_myszy > f_max THEN
- :new.przydzial_myszy := f_max;
- END IF;
- END BEFORE EACH ROW;
- AFTER STATEMENT IS
- tmp NUMBER DEFAULT 0;
- BEGIN
- IF kara > 0 THEN
- tmp := kara;
- kara := 0;
- UPDATE Kocury SET przydzial_myszy = przydzial_myszy * ( 1 - (0.1 * tmp)) WHERE pseudo = 'TYGRYS';
- END IF;
- IF nagroda > 0 THEN
- tmp := nagroda;
- nagroda := 0;
- UPDATE Kocury SET myszy_extra = myszy_extra + (Zad42.nagroda * 5) WHERE pseudo = 'TYGRYS';
- END IF;
- END AFTER STATEMENT;
- END Zad42_CompoundTrigger;
- --test
- SELECT * FROM Kocury;
- UPDATE Kocury SET przydzial_myszy = przydzial_myszy + 1;
- SELECT * FROM Kocury;
- ROLLBACK;
- DROP TRIGGER Zad42_CompoundTrigger;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement