Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.36 KB | None | 0 0
  1. -- Zad 42
  2.  
  3. --A
  4.  
  5. --pakiet
  6. CREATE OR REPLACE PACKAGE Zad42 AS
  7. przydzial NUMBER DEFAULT 0;
  8. kara NUMBER DEFAULT 0;
  9. nagroda NUMBER DEFAULT 0;
  10. END Zad42;
  11.  
  12. --wyzwalacz: przed updatem zapisz przydzial tygrysa do pakietu
  13. CREATE OR REPLACE TRIGGER Zad42_BeforeUpdate
  14. BEFORE UPDATE ON kocury
  15. BEGIN
  16. SELECT przydzial_myszy INTO Zad42.przydzial FROM Kocury WHERE pseudo = 'TYGRYS';
  17. END;
  18.  
  19. --wyzwalacz dla kazdego wiersza przed update
  20. CREATE OR REPLACE TRIGGER Zad42_BeforeUpdateEachRow
  21. BEFORE UPDATE ON Kocury
  22. FOR EACH ROW
  23. DECLARE
  24. f_min NUMBER DEFAULT 0;
  25. f_max NUMBER DEFAULT 0;
  26. diff NUMBER DEFAULT 0;
  27. BEGIN
  28. SELECT min_myszy, max_myszy INTO f_min, f_max FROM Funkcje WHERE funkcja = :new.funkcja;
  29.  
  30. IF :new.funkcja = 'MILUSIA' THEN
  31. IF :new.przydzial_myszy < :old.przydzial_myszy THEN
  32. :new.przydzial_myszy := :old.przydzial_myszy;
  33. DBMS_OUTPUT.PUT_LINE('Zablokowano probe obnizki kota ' || :new.pseudo
  34. || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
  35. END IF;
  36.  
  37. diff := :new.przydzial_myszy - :old.przydzial_myszy;
  38.  
  39. IF (diff > 0) AND (diff < 0.1 * Zad42.przydzial) THEN
  40.  
  41. DBMS_OUTPUT.PUT_LINE('Kara dla Tygrysa za zmiane dla kota ' || :new.pseudo
  42. || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
  43.  
  44. Zad42.kara := Zad42.kara + 1;
  45. :new.przydzial_myszy := :new.przydzial_myszy + 0.1 * Zad42.przydzial;
  46. :new.myszy_extra := :new.myszy_extra + 5;
  47. ELSIF (diff > 0) AND (diff >= 0.1 * Zad42.przydzial) THEN
  48.  
  49. DBMS_OUTPUT.PUT_LINE('Nagroda dla Tygrysa za zmiane dla kota ' || :new.pseudo
  50. || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
  51.  
  52. Zad42.nagroda := Zad42.nagroda + 1;
  53. END IF;
  54. END IF;
  55.  
  56. -- Sprawdzanie przekroczenia wartosci dla funkcji:
  57. IF :new.przydzial_myszy < f_min THEN
  58. :new.przydzial_myszy := f_min;
  59. ELSIF :new.przydzial_myszy > f_max THEN
  60. :new.przydzial_myszy := f_max;
  61. END IF;
  62. END;
  63.  
  64. --wyzwalacz po update gdy nagroda lub kara jest > 0 odp obniz przydzial tygrysa lub zwieksz
  65. CREATE OR REPLACE TRIGGER Zad42_AfterUpdate
  66. AFTER UPDATE ON Kocury
  67. DECLARE
  68. tmp NUMBER DEFAULT 0;
  69. BEGIN
  70. IF Zad42.kara > 0 THEN
  71. tmp := Zad42.kara;
  72. Zad42.kara := 0;
  73. UPDATE Kocury SET przydzial_myszy = przydzial_myszy * ( 1 - (0.1 * tmp)) WHERE pseudo = 'TYGRYS';
  74. END IF;
  75.  
  76. IF Zad42.nagroda > 0 THEN
  77. tmp := Zad42.nagroda;
  78. Zad42.nagroda := 0;
  79. UPDATE Kocury SET myszy_extra = myszy_extra + (Zad42.nagroda * 5) WHERE pseudo = 'TYGRYS';
  80. END IF;
  81. END;
  82.  
  83. SHOW ERRORS;
  84.  
  85. --test
  86. SELECT * FROM Kocury;
  87. UPDATE Kocury SET przydzial_myszy = przydzial_myszy + 1;
  88. SELECT * FROM Kocury;
  89.  
  90. ROLLBACK;
  91. DROP TRIGGER Zad42_BeforeUpdate;
  92. DROP TRIGGER Zad42_BeforeUpdateEachRow;
  93. DROP TRIGGER Zad42_AfterUpdate;
  94.  
  95. -- B
  96.  
  97. CREATE OR REPLACE TRIGGER Zad42_CompoundTrigger
  98. FOR UPDATE ON Kocury
  99. COMPOUND TRIGGER
  100. przydzial NUMBER DEFAULT 0;
  101. kara NUMBER DEFAULT 0;
  102. nagroda NUMBER DEFAULT 0;
  103.  
  104. BEFORE STATEMENT IS
  105. f_min NUMBER DEFAULT 0;
  106. f_max NUMBER DEFAULT 0;
  107. diff NUMBER DEFAULT 0;
  108. BEGIN
  109. SELECT przydzial_myszy INTO przydzial FROM Kocury WHERE pseudo = 'TYGRYS';
  110. END BEFORE STATEMENT;
  111.  
  112. BEFORE EACH ROW IS BEGIN
  113. SELECT min_myszy, max_myszy INTO f_min, f_max
  114. FROM Funkcje WHERE funkcja = :new.funkcja;
  115.  
  116. IF :new.funkcja = 'MILUSIA' THEN
  117. IF :new.przydzial_myszy < :old.przydzial_myszy THEN
  118. :new.przydzial_myszy := :old.przydzial_myszy;
  119. DBMS_OUTPUT.PUT_LINE('Zablokowano probe obnizki kota ' || :new.pseudo
  120. || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
  121. END IF;
  122.  
  123. diff := :new.przydzial_myszy - :old.przydzial_myszy;
  124.  
  125. IF (diff > 0) AND (diff < 0.1 * przydzial) THEN
  126.  
  127. DBMS_OUTPUT.PUT_LINE('Kara dla Tygrysa za zmiane dla kota ' || :new.pseudo
  128. || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
  129.  
  130.  
  131. kara := kara + 1;
  132. :new.przydzial_myszy := :new.przydzial_myszy + 0.1 * przydzial;
  133. :new.myszy_extra := :new.myszy_extra + 5;
  134. ELSIF (diff > 0) AND (diff >= 0.1 * przydzial) THEN
  135.  
  136. DBMS_OUTPUT.PUT_LINE('Nagroda dla Tygrysa za zmiane dla kota ' || :new.pseudo
  137. || ' z ' || :old.przydzial_myszy || ' na ' || :new.przydzial_myszy);
  138.  
  139.  
  140. nagroda := nagroda + 1;
  141. END IF;
  142. END IF;
  143.  
  144. -- Sprawdzanie przekroczenia wartosci dla funkcji:
  145. IF :new.przydzial_myszy < f_min THEN
  146. :new.przydzial_myszy := f_min;
  147. ELSIF :new.przydzial_myszy > f_max THEN
  148. :new.przydzial_myszy := f_max;
  149. END IF;
  150. END BEFORE EACH ROW;
  151.  
  152. AFTER STATEMENT IS
  153. tmp NUMBER DEFAULT 0;
  154. BEGIN
  155. IF kara > 0 THEN
  156. tmp := kara;
  157. kara := 0;
  158. UPDATE Kocury SET przydzial_myszy = przydzial_myszy * ( 1 - (0.1 * tmp)) WHERE pseudo = 'TYGRYS';
  159. END IF;
  160.  
  161. IF nagroda > 0 THEN
  162. tmp := nagroda;
  163. nagroda := 0;
  164. UPDATE Kocury SET myszy_extra = myszy_extra + (Zad42.nagroda * 5) WHERE pseudo = 'TYGRYS';
  165. END IF;
  166. END AFTER STATEMENT;
  167. END Zad42_CompoundTrigger;
  168.  
  169.  
  170. --test
  171. SELECT * FROM Kocury;
  172. UPDATE Kocury SET przydzial_myszy = przydzial_myszy + 1;
  173. SELECT * FROM Kocury;
  174.  
  175. ROLLBACK;
  176. DROP TRIGGER Zad42_CompoundTrigger;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement