Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.46 KB | None | 0 0
  1. -- zad 49
  2.  
  3.  
  4.  
  5. DECLARE
  6. BEGIN
  7. EXECUTE IMMEDIATE
  8. 'CREATE TABLE Myszy(
  9. nr_myszy NUMBER GENERATED BY DEFAULT AS IDENTITY constraint myszy_pk primary key,
  10. lowca VARCHAR2(15) constraint lowca_myszy_fk references Kocury(pseudo),
  11. zjadacz VARCHAR2(15)constraint zjadacz_myszy_fk references Kocury(pseudo),
  12. waga NUMBER NOT NULL constraint normy_wg check(waga between 5 AND 20),
  13. data_zlowienia DATE NOT NULL,
  14. data_wydania DATE
  15. )';
  16. COMMIT;
  17. END;
  18.  
  19.  
  20. ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
  21. DROP TABLE Myszy;
  22.  
  23. DECLARE
  24. poczatek_miesiaca DATE DEFAULT '2004-01-01';
  25. dzien_wyplaty DATE;
  26. TYPE record_pseudo_przydzial IS RECORD (pseudo Kocury.pseudo%Type, przydzial Kocury.przydzial_myszy%TYPE);
  27. TYPE tk IS TABLE OF record_pseudo_przydzial INDEX BY BINARY_INTEGER;
  28. TYPE tm IS TABLE OF Myszy%ROWTYPE INDEX BY BINARY_INTEGER;
  29. tabMyszy tm;
  30. tabKocurow tk;
  31. myszy_do_dodania NUMBER;
  32. srednie_spozycie_zaokr NUMBER;
  33. wyplacono NUMBER :=0;
  34. aktualnyLowca NUMBER :=1;
  35. aktualnyZjadacz NUMBER :=1;
  36. ile_zjada NUMBER :=0;
  37. numer_myszy NUMBER :=1;
  38. BEGIN
  39. -- iteracja po wszystkich miesiacach
  40. WHILE poczatek_miesiaca < '2018-01-15'
  41. LOOP
  42.  
  43. dzien_wyplaty := next_day(last_day(poczatek_miesiaca)-7, 'ŒRODA');
  44.  
  45. SELECT pseudo, NVL(przydzial_myszy,0) + NVL(myszy_ekstra,0) BULK COLLECT INTO tabKocurow
  46. FROM Kocury
  47. WHERE w_stadku_od < poczatek_miesiaca;
  48.  
  49. select sum(NVL(przydzial_myszy,0) + NVL(myszy_ekstra,0)) into myszy_do_dodania
  50. from Kocury
  51. where w_stadku_od < poczatek_miesiaca;
  52.  
  53. select floor(avg(NVL(przydzial_myszy,0) + NVL(myszy_ekstra,0))) into srednie_spozycie_zaokr
  54. from Kocury
  55. where w_stadku_od < poczatek_miesiaca;
  56.  
  57.  
  58. for i in 1..myszy_do_dodania
  59. LOOP -- rozdzial myszy w jednym miesiacu
  60. IF aktualnyLowca <= tabKocurow.COUNT
  61. THEN
  62. tabMyszy(numer_myszy).lowca := tabKocurow(aktualnyLowca).pseudo;
  63. wyplacono := wyplacono +1;
  64. IF wyplacono = srednie_spozycie_zaokr
  65. THEN
  66. aktualnyLowca := aktualnyLowca + 1;
  67. wyplacono := 0;
  68. END IF;
  69. ELSE
  70. tabMyszy(numer_myszy).lowca := 'TYGRYS';
  71. END IF;
  72.  
  73. tabMyszy(numer_myszy).waga := ROUND(dbms_random.value(5,20));
  74. tabMyszy(numer_myszy).data_zlowienia := poczatek_miesiaca + dbms_random.value(0,27);
  75.  
  76. -- ustawiamy zjadacza
  77. IF dzien_wyplaty < '2018-01-15'
  78. THEN
  79. tabMyszy(numer_myszy).data_wydania := dzien_wyplaty;
  80. IF ile_zjada != tabKocurow(aktualnyZjadacz).przydzial
  81. THEN
  82. tabMyszy(numer_myszy).zjadacz := tabKocurow(aktualnyZjadacz).pseudo;
  83. ile_zjada := ile_zjada +1;
  84. ELSE
  85. aktualnyZjadacz := aktualnyZjadacz +1;
  86. ile_zjada :=1;
  87. tabMyszy(numer_myszy).zjadacz:= tabKocurow(aktualnyZjadacz).pseudo;
  88. END IF;
  89. ELSE
  90. tabMyszy(numer_myszy).data_wydania := null;
  91. END IF;
  92.  
  93.  
  94. numer_myszy := numer_myszy +1;
  95.  
  96. END LOOP; -- koniec petli dla danej myszy
  97. aktualnyZjadacz:=1;
  98. aktualnyLowca :=1;
  99. wyplacono :=0;
  100. ile_zjada:=0;
  101. poczatek_miesiaca := last_day(dzien_wyplaty) + 1;
  102.  
  103. END LOOP; -- koniec petli dla danego miesiaca
  104. FORALL i IN 1..tabMyszy.COUNT
  105. insert into Myszy(lowca, zjadacz, waga, data_zlowienia, data_wydania) VALUES
  106. (tabMyszy(i).lowca, tabMyszy(i).zjadacz, tabMyszy(i).waga, tabMyszy(i).data_zlowienia, tabMyszy(i).data_wydania);
  107. END;
  108.  
  109. SELECT * from myszy where data_wydania IS NULL
  110. SELECT COUNT(*) from myszy
  111. DROP TABLE myszy;
  112.  
  113. DROP TABLE MYSZY_ZOMBI
  114.  
  115. CREATE TABLE MYSZY_ZOMBI (
  116. nr_myszy NUMBER GENERATED BY DEFAULT AS IDENTITY constraint myszy_tyg_pk primary key,
  117. waga NUMBER not null constraint normy_wagowe check(waga between 5 AND 20),
  118. data_zlowienia DATE not null
  119. );
  120.  
  121. INSERT INTO MYSZY_ZOMBI(waga, data_zlowienia) VALUES(7, '2018-01-16');
  122. INSERT INTO MYSZY_ZOMBI(waga, data_zlowienia) VALUES(15, '2018-01-16');
  123. INSERT INTO MYSZY_ZOMBI(waga, data_zlowienia) VALUES(10, '2018-01-16');
  124. INSERT INTO MYSZY_ZOMBI(waga, data_zlowienia) VALUES(9, '2018-01-16');
  125.  
  126.  
  127. CREATE OR REPLACE PROCEDURE dodaj_myszy (pseudo_kota Kocury.pseudo%TYPE, data_lowow DATE ) AS
  128. TYPE record_lowy_myszy IS RECORD (nr NUMBER, waga NUMBER, data DATE);
  129. TYPE tab_lowy_myszy_typ IS TABLE OF record_lowy_myszy INDEX BY BINARY_INTEGER;
  130. tab_lowy_myszy tab_lowy_myszy_typ;
  131. sprawdz_koty NUMBER;
  132. BRAK_KOTA_EXCEPTION EXCEPTION;
  133. BEGIN
  134.  
  135. SELECT COUNT(*) INTO sprawdz_koty
  136. FROM Kocury
  137. WHERE pseudo = pseudo_kota;
  138.  
  139.  
  140. IF sprawdz_koty = 0
  141. THEN RAISE BRAK_KOTA_EXCEPTION;
  142. END IF;
  143.  
  144. EXECUTE IMMEDIATE 'SELECT * FROM MYSZY_' || pseudo_kota ||
  145. ' WHERE data_zlowienia = '''|| data_lowow||''''
  146. BULK COLLECT INTO tab_lowy_myszy;
  147.  
  148.  
  149. FORALL i in 1..tab_lowy_myszy.COUNT
  150. INSERT INTO MYSZY(lowca,zjadacz,waga,data_zlowienia,data_wydania)
  151. VALUES (pseudo_kota,null, tab_lowy_myszy(i).waga, data_lowow,null);
  152.  
  153. EXCEPTION
  154. WHEN BRAK_KOTA_EXCEPTION THEN DBMS_OUTPUT.PUT_LINE('Zly pseudonim kota');
  155. END;
  156.  
  157.  
  158. EXECUTE dodaj_myszy ('ZOMBI', TO_DATE('2018-01-16'));
  159.  
  160.  
  161. SELECT * FROM MYSZY WHERE data_wydania IS NULL;
  162.  
  163.  
  164. CREATE OR REPLACE PROCEDURE wyplata (data DATE) IS
  165. dzien_wyplaty DATE;
  166. TYPE record_myszy IS RECORD (nr_myszy NUMBER, zjadacz Myszy.zjadacz%TYPE);
  167. TYPE record_kocury IS RECORD (pseudo Kocury.pseudo%Type, przydzial NUMBER, nie_ma_MAX NUMBER);
  168.  
  169. TYPE tab_typ_myszy IS TABLE OF record_myszy INDEX BY BINARY_INTEGER;
  170. TYPE tab_typ_kocury IS TABLE OF record_kocury INDEX BY BINARY_INTEGER;
  171.  
  172. tab_kocury tab_typ_kocury;
  173. tab_myszy tab_typ_myszy;
  174.  
  175. do_wyplaty NUMBER:=0;
  176. ile_ma_MAX NUMBER:=0;
  177. wyplacono_myszy NUMBER:=0;
  178. BEGIN
  179.  
  180. dzien_wyplaty := next_day(last_day(data)-7, 'œroda');
  181.  
  182. SELECT nr_myszy, zjadacz BULK COLLECT INTO tab_myszy
  183. FROM Myszy
  184. WHERE data_wydania IS NULL;
  185.  
  186. -- nie ma MAX - flaga: 0 - false, 1 - true
  187. SELECT pseudo, NVL(przydzial_myszy,0)+NVL(myszy_ekstra,0), 0 BULK COLLECT INTO tab_kocury
  188. FROM Kocury
  189. WHERE w_stadku_od <= dzien_wyplaty
  190. START WITH szef IS NULL
  191. CONNECT BY PRIOR pseudo = szef
  192. ORDER BY level ASC;
  193.  
  194. do_wyplaty:= tab_myszy.COUNT();
  195.  
  196. while do_wyplaty > wyplacono_myszy
  197. LOOP
  198. for i in 1..tab_kocury.COUNT()
  199. LOOP
  200. IF do_wyplaty > wyplacono_myszy AND ile_ma_MAX != tab_kocury.COUNT()
  201. THEN
  202. IF tab_kocury(i).nie_ma_MAX = 0
  203. THEN
  204. tab_kocury(i).przydzial := tab_kocury(i).przydzial -1;
  205. wyplacono_myszy:= wyplacono_myszy +1;
  206. tab_myszy(wyplacono_myszy).zjadacz := tab_kocury(i).pseudo;
  207. IF tab_kocury(i).przydzial = 0
  208. THEN
  209. tab_kocury(i).nie_ma_MAX := 1;
  210. ile_ma_MAX := ile_ma_MAX + 1;
  211. END IF;
  212. ELSE IF do_wyplaty > wyplacono_myszy
  213. THEN
  214. wyplacono_myszy:= wyplacono_myszy +1;
  215. tab_myszy(wyplacono_myszy).zjadacz := 'TYGRYS';
  216. END IF;
  217. END IF;
  218. END IF;
  219. END LOOP;
  220. END LOOP;
  221. FORALL i in 1..tab_myszy.COUNT
  222. UPDATE Myszy
  223. SET zjadacz = tab_myszy(i).zjadacz , data_wydania = dzien_wyplaty
  224. WHERE nr_myszy = tab_myszy(i).nr_myszy;
  225. END;
  226.  
  227.  
  228. DROP TABLE MYSZY_ZOMBI
  229.  
  230. CREATE TABLE MYSZY_ZOMBI (
  231. nr_myszy NUMBER GENERATED BY DEFAULT AS IDENTITY constraint myszy_tyg_pk primary key,
  232. waga NUMBER not null constraint normy_wagowe check(waga between 5 AND 20),
  233. data_zlowienia DATE not null
  234. );
  235.  
  236. INSERT INTO MYSZY_ZOMBI(waga, data_zlowienia) VALUES(7, '2018-01-16');
  237. INSERT INTO MYSZY_ZOMBI(waga, data_zlowienia) VALUES(5, '2018-01-16');
  238. INSERT INTO MYSZY_ZOMBI(waga, data_zlowienia) VALUES(10, '2018-01-16');
  239. INSERT INTO MYSZY_ZOMBI(waga, data_zlowienia) VALUES(9, '2018-01-16');
  240.  
  241. DROP TABLE MYSZY_TYGRYS
  242.  
  243. CREATE TABLE MYSZY_TYGRYS (
  244. nr_myszy NUMBER GENERATED BY DEFAULT AS IDENTITY constraint myszy_tyg_pk1 primary key,
  245. waga NUMBER not null constraint normy_wagowe1 check(waga between 5 AND 20),
  246. data_zlowienia DATE not null
  247. );
  248.  
  249. INSERT INTO MYSZY_TYGRYS(waga, data_zlowienia) VALUES(7, '2018-01-16');
  250. INSERT INTO MYSZY_TYGRYS(waga, data_zlowienia) VALUES(5, '2018-01-16');
  251. INSERT INTO MYSZY_TYGRYS(waga, data_zlowienia) VALUES(10, '2018-01-16');
  252. INSERT INTO MYSZY_TYGRYS(waga, data_zlowienia) VALUES(9, '2018-01-16');
  253.  
  254. DROP TABLE MYSZY_LYSY
  255.  
  256. CREATE TABLE MYSZY_LYSY (
  257. nr_myszy NUMBER GENERATED BY DEFAULT AS IDENTITY constraint myszy_tyg_pk2 primary key,
  258. waga NUMBER not null constraint normy_wagowe2 check(waga between 5 AND 20),
  259. data_zlowienia DATE not null
  260. );
  261.  
  262. INSERT INTO MYSZY_LYSY(waga, data_zlowienia) VALUES(8, '2018-01-16');
  263. INSERT INTO MYSZY_LYSY(waga, data_zlowienia) VALUES(9, '2018-01-16');
  264. INSERT INTO MYSZY_LYSY(waga, data_zlowienia) VALUES(10, '2018-01-16');
  265. INSERT INTO MYSZY_LYSY(waga, data_zlowienia) VALUES(9, '2018-01-16');
  266.  
  267.  
  268. EXECUTE dodaj_myszy ('TYGRYS', TO_DATE('2018-01-16'));
  269. EXECUTE dodaj_myszy ('LYSY', TO_DATE('2018-01-16'));
  270. EXECUTE dodaj_myszy ('ZOMBI', TO_DATE('2018-01-16'));
  271.  
  272.  
  273. Execute wyplata('2018-1-20');
  274.  
  275. SELECT * FROM MYSZY
  276. ORDER BY data_wydania
  277.  
  278. Execute wyplata('2020-2-1');
  279. select * from myszy order by 6 DESC;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement