Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.88 KB | None | 0 0
  1. -- Zad. 48.* Rozszerzyć relacyjną bazę danych kotów o dodatkowe relacje opisujące elitę, plebs
  2. -- i konta elity (patrz opis z zad. 47) a następnie zdefiniować "nakładkę", w postaci perspektyw
  3. -- obiektowych (bez odpowiedników relacji Funkcje, Bandy, Wrogowie), na tak
  4. -- zmodyfikowaną bazę. Odpowiadające relacjom typy obiektowe mają zawierać przykładowe
  5. -- metody (mogą to być metody z zad. 47). Zamodelować wszystkie powiązania referencyjne z
  6. -- wykorzystaniem identyfikatorów OID i funkcji MAKE_REF. Relacje wypełnić
  7. -- przykładowymi danymi (mogą to być dane z zad. 47). Dla tak przygotowanej bazy wykonać
  8. -- wszystkie zapytania SQL i bloki PL/SQL zrealizowane w ramach zad. 47.
  9. DROP TABLE KONTA_P;
  10. DROP TABLE ELITA_P;
  11. DROP TABLE PLEBS_P;
  12.  
  13.  
  14.  
  15.  
  16. CREATE TABLE PLEBS_P (
  17. id_plebejusza NUMBER CONSTRAINT rp_pk PRIMARY KEY,
  18. czlonek VARCHAR2(15) CONSTRAINT rp_sc_k REFERENCES Kocury (pseudo)
  19. );
  20.  
  21. CREATE TABLE ELITA_P (
  22. nr_prominenta NUMBER CONSTRAINT re_pk PRIMARY KEY,
  23. czlonek VARCHAR(15) CONSTRAINT re_sc_k REFERENCES Kocury (pseudo),
  24. sluga NUMBER CONSTRAINT re_sc_e REFERENCES PLEBS_P (id_plebejusza)
  25. );
  26.  
  27. CREATE TABLE KONTA_P (
  28. nr_konta NUMBER CONSTRAINT ro_pk PRIMARY KEY,
  29. wlasciciel NUMBER CONSTRAINT ro_sc_k REFERENCES ELITA_P (nr_prominenta),
  30. data_wprowadzenia DATE,
  31. data_usuniecia DATE,
  32. CONSTRAINT ro_dw CHECK (data_wprowadzenia IS NOT NULL),
  33. CONSTRAINT ro_du CHECK (data_wprowadzenia <= data_usuniecia)
  34. );
  35.  
  36.  
  37.  
  38.  
  39. --- OBIEKTY
  40.  
  41. -- CREATE OR REPLACE TYPE TYP_KOT
  42. -- AS OBJECT
  43. -- (
  44. -- imie VARCHAR2(15),
  45. -- plec VARCHAR2(1),
  46. -- pseudo VARCHAR2(15),
  47. -- funkcja VARCHAR2(10),
  48. -- szef REF TYP_KOT,
  49. -- w_stadku_od DATE,
  50. -- przydzial_myszy NUMBER(3),
  51. -- myszy_extra NUMBER(3),
  52. -- nr_bandy NUMBER(2),
  53. --
  54. -- MAP MEMBER FUNCTION PorownajPseudo
  55. -- RETURN VARCHAR2,
  56. -- MEMBER FUNCTION calkowiteSpozycieMyszy
  57. -- RETURN NUMBER,
  58. -- MEMBER FUNCTION czyRekrut
  59. -- RETURN BOOLEAN,
  60. -- MEMBER FUNCTION dajSzefa
  61. -- RETURN TYP_KOT
  62. --
  63. -- );
  64. --
  65. -- CREATE OR REPLACE TYPE BODY TYP_KOT AS
  66. -- MAP MEMBER FUNCTION PorownajPseudo
  67. -- RETURN VARCHAR2
  68. -- IS
  69. -- BEGIN
  70. -- RETURN pseudo;
  71. -- END;
  72. --
  73. -- MEMBER FUNCTION calkowiteSpozycieMyszy
  74. -- RETURN NUMBER
  75. -- IS
  76. -- BEGIN
  77. -- RETURN NVL(przydzial_myszy, 0) + NVL(myszy_extra, 0);
  78. -- END;
  79. --
  80. -- MEMBER FUNCTION czyRekrut
  81. -- RETURN BOOLEAN
  82. -- IS
  83. -- BEGIN
  84. -- RETURN (SYSDATE - w_stadku_od) < 90;
  85. -- END;
  86. --
  87. -- MEMBER FUNCTION dajSzefa
  88. -- RETURN TYP_KOT
  89. -- IS
  90. -- szefu TYP_KOT;
  91. -- BEGIN
  92. -- SELECT DEREF(szef)
  93. -- INTO szefu
  94. -- FROM DUAL;
  95. -- RETURN szefu;
  96. -- END;
  97. --
  98. --
  99. -- END;
  100. -- -- PLEBS
  101. --
  102. -- CREATE OR REPLACE TYPE TYP_PLEBS
  103. -- AS OBJECT
  104. -- (
  105. -- id_plebejusza NUMBER,
  106. -- czlonek REF TYP_KOT,
  107. --
  108. -- MEMBER FUNCTION dajKota
  109. -- RETURN TYP_KOT
  110. -- );
  111. --
  112. -- CREATE OR REPLACE TYPE BODY TYP_PLEBS IS
  113. -- MEMBER FUNCTION dajKota
  114. -- RETURN TYP_KOT IS plebejusz TYP_KOT;
  115. -- BEGIN
  116. -- SELECT DEREF(czlonek)
  117. -- INTO plebejusz
  118. -- FROM DUAL;
  119. -- RETURN plebejusz;
  120. -- END;
  121. -- END;
  122. -- -- ELITA
  123. --
  124. -- CREATE OR REPLACE TYPE TYP_ELITA
  125. -- AS OBJECT
  126. -- (
  127. -- nr_prominenta NUMBER,
  128. -- czlonek REF TYP_KOT,
  129. -- sluga REF TYP_PLEBS,
  130. --
  131. -- MEMBER FUNCTION dajSluge
  132. -- RETURN TYP_PLEBS,
  133. -- MEMBER FUNCTION czyMaSluge
  134. -- RETURN BOOLEAN
  135. -- );
  136. --
  137. -- CREATE OR REPLACE TYPE BODY TYP_ELITA IS
  138. --
  139. -- MEMBER FUNCTION dajSluge
  140. -- RETURN TYP_PLEBS IS RESULT TYP_PLEBS;
  141. -- BEGIN
  142. -- SELECT DEREF(sluga)
  143. -- INTO RESULT
  144. -- FROM DUAL;
  145. -- RETURN RESULT;
  146. -- END;
  147. --
  148. -- MEMBER FUNCTION czyMaSluge
  149. -- RETURN BOOLEAN IS
  150. -- BEGIN
  151. -- RETURN sluga IS NOT NULL;
  152. -- END;
  153. -- END;
  154. --
  155. -- -- KONTO
  156. -- CREATE OR REPLACE TYPE TYP_KONTO
  157. -- AS OBJECT
  158. -- (
  159. -- nr_konta NUMBER,
  160. -- wlasciciel REF TYP_ELITA,
  161. -- data_wprowadzenia DATE,
  162. -- data_usuniecia DATE,
  163. --
  164. -- MEMBER FUNCTION czasPrzechowywania
  165. -- RETURN NUMBER,
  166. -- MEMBER FUNCTION czyAktywne
  167. -- RETURN BOOLEAN
  168. -- );
  169. --
  170. -- CREATE OR REPLACE TYPE BODY TYP_KONTO IS
  171. --
  172. -- MEMBER FUNCTION czasPrzechowywania
  173. -- RETURN NUMBER IS dni NUMBER;
  174. -- BEGIN
  175. -- RETURN NVL(data_usuniecia, SYSDATE) - data_wprowadzenia;
  176. -- END;
  177. --
  178. -- MEMBER FUNCTION czyAktywne
  179. -- RETURN BOOLEAN IS
  180. -- BEGIN
  181. -- RETURN data_usuniecia IS NOT NULL;
  182. -- END;
  183. --
  184. -- END;
  185.  
  186. CREATE OR REPLACE FORCE VIEW KOTY_V
  187. OF TYP_KOT
  188. WITH OBJECT IDENTIFIER (pseudo) AS
  189. SELECT
  190. imie,
  191. plec,
  192. pseudo,
  193. funkcja,
  194. MAKE_REF(KOTY_V, szef) szef,
  195. w_stadku_od,
  196. przydzial_myszy,
  197. myszy_extra,
  198. nr_bandy
  199. FROM KOCURY;
  200.  
  201. CREATE OR REPLACE VIEW PLEBS_V
  202. OF TYP_PLEBS
  203. WITH OBJECT IDENTIFIER (id_plebejusza) AS
  204. SELECT
  205. id_plebejusza,
  206. MAKE_REF(KOTY_V, czlonek) czlonek
  207. FROM PLEBS_P;
  208.  
  209. CREATE OR REPLACE VIEW ELITA_V
  210. OF TYP_ELITA
  211. WITH OBJECT IDENTIFIER (nr_prominenta) AS
  212. SELECT
  213. nr_prominenta,
  214. MAKE_REF(KOTY_V, czlonek) czlonek,
  215. MAKE_REF(PLEBS_V, sluga) sluga
  216. FROM ELITA_P;
  217.  
  218. CREATE OR REPLACE VIEW KONTA_V
  219. OF TYP_KONTO
  220. WITH OBJECT IDENTIFIER (nr_konta) AS
  221. SELECT
  222. nr_konta,
  223. MAKE_REF(ELITA_V, wlasciciel) wlasciciel,
  224. data_wprowadzenia,
  225. data_usuniecia
  226. FROM KONTA_P;
  227.  
  228. ----------------------------------------
  229. --------ZADANIA-------------------------
  230. -- ZAPYTANIA
  231.  
  232. --referencje
  233. SELECT DEREF(WLASCICIEL).CZLONEK.PSEUDO "WLASCICIEL KONTA NR 6"
  234. FROM
  235. KONTA_V KV
  236. WHERE KV.NR_KONTA = '6';
  237.  
  238. --podzapytanie
  239. -- PSEUDO PROMINENTOW
  240. SELECT PSEUDO
  241. FROM KOTY_V
  242. WHERE PSEUDO IN (
  243. SELECT DEREF(CZLONEK).PSEUDO
  244. FROM ELITA_V
  245. );
  246.  
  247. --grupowanie - ILOSC ZDEPONOWANYCH MYSZY
  248. SELECT
  249. DEREF(K.WLASCICIEL).CZLONEK.pseudo,
  250. COUNT(*)
  251. FROM Konta_V k
  252. GROUP BY DEREF(K.WLASCICIEL).CZLONEK.pseudo;
  253.  
  254. --metody
  255. SELECT
  256. PSEUDO,
  257. MYSZY_EXTRA,
  258. K.CALKOWITESPOZYCIEMYSZY()
  259. FROM
  260. KOTY_V K
  261. WHERE K.CALKOWITESPOZYCIEMYSZY() > 50 AND MYSZY_EXTRA IS NULL;
  262.  
  263.  
  264. ---ILE MYSZY NA KONCIE KOT Z ELITY PLCI ZE
  265.  
  266. SELECT
  267.  
  268.  
  269.  
  270.  
  271. -----------------------------
  272. --ZADANIA Z LISTY 2
  273. --ZADANIE 18
  274.  
  275. SELECT
  276. K1.imie "IMIE",
  277. K1.w_stadku_od "POLUJE OD"
  278. FROM
  279. KOTY_V K1,
  280. KOTY_V K2
  281. WHERE
  282. K2.IMIE = 'JACEK' AND
  283. K1.WstapilPrzed(value(K2)) = 'TRUE'
  284. ORDER BY K1.w_stadku_od DESC;
  285.  
  286. -- ZAD 26
  287. SELECT
  288. FUNKCJA,
  289. ROUND(AVG(kocur.calkowitespozyciemyszy()))
  290. FROM koty_V kocur
  291. WHERE FUNKCJA <> 'SZEFUNIO'
  292. GROUP BY FUNKCJA
  293. HAVING ROUND(AVG(NVL(PRZYDZIAL_MYSZY, 0) + NVL(MYSZY_EXTRA, 0))) >= ALL (
  294. SELECT ROUND(AVG(kocur.calkowitespozyciemyszy()))
  295. FROM koty_V kocur
  296. WHERE funkcja != 'SZEFUNIO'
  297. GROUP BY funkcja
  298. )
  299. OR ROUND(AVG(NVL(PRZYDZIAL_MYSZY, 0) + NVL(MYSZY_EXTRA, 0))) <= ALL (
  300. SELECT ROUND(AVG(kocur.calkowitespozyciemyszy()))
  301. FROM koty_V kocur
  302. WHERE funkcja != 'SZEFUNIO'
  303. GROUP BY funkcja
  304. );
  305.  
  306. --ZADANIA Z LISTY 3
  307.  
  308. --ZADANIE 35
  309.  
  310. DECLARE
  311. PSEUDO_KOTA KOTY.PSEUDO%TYPE;
  312. ROCZNY_PRZYDZIAL NUMBER(4);
  313. IMIE_KOTA KOTY.IMIE%TYPE;
  314. DATA_PRZYST KOTY.W_STADKU_OD%TYPE;
  315.  
  316.  
  317. BEGIN
  318. SELECT
  319. K.PSEUDO,
  320. K.CALKOWITESPOZYCIEMYSZY()*12,
  321. K.IMIE,
  322. K.W_STADKU_OD
  323. INTO
  324. PSEUDO_KOTA,
  325. ROCZNY_PRZYDZIAL,
  326. IMIE_KOTA,
  327. DATA_PRZYST
  328. FROM
  329. KOTY_V K
  330. WHERE
  331. K.PSEUDO = :PSEUDO;
  332.  
  333. IF ROCZNY_PRZYDZIAL > 700
  334. THEN
  335. DBMS_OUTPUT.PUT_LINE(IMIE_KOTA || ' - calkowity roczny przydzial myszy > 700');
  336. ELSE
  337. IF IMIE_KOTA LIKE '%A%'
  338. THEN
  339. DBMS_OUTPUT.PUT_LINE(IMIE_KOTA || ' - imie zawiera litere A');
  340. ELSE
  341. IF EXTRACT(MONTH FROM DATA_PRZYST) = 01
  342. THEN
  343. DBMS_OUTPUT.PUT_LINE(IMIE_KOTA || ' - styczen jest miesiacem przystapienia do stada');
  344. ELSE
  345. DBMS_OUTPUT.PUT_LINE(IMIE_KOTA || ' nie odpowiada kryteriom');
  346. END IF;
  347. END IF;
  348. END IF;
  349. EXCEPTION
  350. WHEN NO_DATA_FOUND
  351. THEN DBMS_OUTPUT.PUT_LINE('NIE MA TAKIEGO KOTKA');
  352. END;
  353.  
  354. --ZADANIE 37
  355. DECLARE
  356. SA_WIERSZE BOOLEAN := FALSE;
  357. BRAK_KOTOW EXCEPTION;
  358. NUMER NUMBER DEFAULT 1;
  359.  
  360. BEGIN
  361. DBMS_OUTPUT.PUT_LINE('Nr Pseudonim Zjada');
  362. DBMS_OUTPUT.PUT_LINE('------------------------');
  363.  
  364. FOR NR IN (SELECT
  365. K.PSEUDO,
  366. K.CALKOWITESPOZYCIEMYSZY() "ZJADA"
  367. FROM KOTY_V K
  368. ORDER BY ZJADA DESC
  369. FETCH FIRST 5 ROWS ONLY
  370. )
  371.  
  372. LOOP
  373. SA_WIERSZE := TRUE;
  374. DBMS_OUTPUT.PUT_LINE(LPAD(NUMER, 4) || ' ' || RPAD(NR.pseudo, 9) || ' ' || LPAD(NR.zjada, 5));
  375. NUMER := NUMER + 1;
  376. END LOOP;
  377.  
  378. IF NOT sa_wiersze
  379. THEN RAISE brak_kotow;
  380. END IF;
  381.  
  382. EXCEPTION
  383. WHEN brak_kotow THEN DBMS_OUTPUT.PUT_LINE('Brak kotow');
  384. WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
  385. END;
  386.  
  387. SELECT *
  388. FROM KOTY_V;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement