Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.57 KB | None | 0 0
  1. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  2. ------------------- Mahdi Asali | 206331795 (and) Elon Avi Sror | 305370801 | Assignement 4 -------------------
  3. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  4.  
  5.  
  6. drop table Docking;
  7. drop table Piers;
  8. drop table Ships;
  9.  
  10. alter session set nls_date_format = 'dd/mm/yy';
  11.  
  12. SET SERVEROUTPUT ON
  13. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  14. ------------------- Part 1-------------------
  15. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  16.  
  17. create table Piers(
  18. pid NUMBER(2) PRIMARY KEY,
  19. name varchar2(20),
  20. capacity NUMBER(5) NOT NULL,
  21. type varchar2(20)UNIQUE,
  22. totalShips INTEGER DEFAULT(0)
  23. )
  24. create table Ships(
  25. sid NUMBER(5) PRIMARY KEY,
  26. name varchar2(20),
  27. country varchar2(20),
  28. cargo_weight NUMBER(5) NOT NULL
  29. )
  30. create table Docking(
  31. sid NUMBER(5) ,
  32. pid NUMBER(2) ,
  33. arrivaldate DATE,
  34. departuredate DATE,
  35. Primary key(sid,pid),
  36. CONSTRAINT pierid FOREIGN KEY( pid) REFERENCES Piers(pid),
  37. CONSTRAINT shipid FOREIGN KEY( sid) REFERENCES Ships(sid)
  38. )
  39. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  40. ------------------- Part 2 -------------------
  41. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  42.  
  43. ---------------TRIGGER----------------
  44.  
  45. --Please add EXCEPTION..
  46. CREATE OR REPLACE TRIGGER totalTrigger
  47.  
  48. BEFORE INSERT ON DOCKING
  49. FOR EACH ROW
  50. DECLARE
  51. varCapacity Piers.Capacity%TYPE;
  52. varCargoWeight SHIPS.CARGO_WEIGHT%TYPE;
  53.  
  54. BEGIN
  55.  
  56.  
  57. update Piers
  58. set TOTALSHIPS =TOTALSHIPS +1
  59. where
  60. PID= :NEW.PID
  61. and
  62. :NEW.arrivaldate <= :NEW.departuredate
  63. and
  64. Piers.Capacity >= (select cargo_weight
  65. from SHIPS
  66. where SHIPS.sid = :NEW.sid);
  67.  
  68. --If The CargoWeight is Illegal
  69. SELECT Capacity INTO varCapacity FROM Piers WHERE Piers.pid =:NEW.pid;
  70.  
  71. SELECT cargo_weight INTO varCargoWeight FROM Ships WHERE Ships.sid=:NEW.sid;
  72.  
  73. if varCargoWeight > varCapacity
  74. Then
  75. Raise_Application_Error (-20343, 'ERROR: Cargo weight should be smaller than Capacity.');
  76. END IF;
  77. -- if the Date is Illegal.
  78. IF :NEW.arrivaldate> :NEW.departuredate THEN
  79. Raise_Application_Error (-20343, 'ERROR: Illegal date .');
  80. END IF;
  81. END totalTrigger;
  82. /
  83.  
  84. ------------------------------------------------------------------------------------
  85. INSERT INTO Piers VALUES(1,'A',30000,'agricultural exports',0);
  86. INSERT INTO Piers VALUES(2,'B',30000,'timber',0);
  87. INSERT INTO Piers VALUES(3,'C',30000,'metals',0);
  88. INSERT INTO Piers VALUES(4,'D',30000,'sling',0);
  89. INSERT INTO Piers VALUES(5,'E',60000,'Panamax',0);
  90. INSERT INTO Piers VALUES(6,'F',30000,'bulk',0);
  91.  
  92.  
  93. ------------------------------------------------------------------------------------
  94. INSERT INTO Ships VALUES(11,'S1','China',30000);
  95. INSERT INTO Ships VALUES(22,'S2','Zimbabwe',25000);
  96. INSERT INTO Ships VALUES(33,'S3','Guatemala',15000);
  97. INSERT INTO Ships VALUES(44,'S4','China',25000);
  98. INSERT INTO Ships VALUES(55,'S5','Marshall Islands',20000);
  99. INSERT INTO Ships VALUES(66,'S6','Russia',20000);
  100. INSERT INTO Ships VALUES(77,'S7','Malta',45000);
  101. INSERT INTO Ships VALUES(88,'S8','Panama',50000);
  102. INSERT INTO Ships VALUES(99,'S9','Malta',15000);
  103. INSERT INTO Ships VALUES(1010,'S10','Marshall Islands',20000);
  104. INSERT INTO Ships VALUES(1111,'S11','Liberia',25000);
  105. INSERT INTO Ships VALUES(1212,'S12','Liberia',15000);
  106. INSERT INTO Ships VALUES(1313,'S13','Zimbabwe',20000);
  107. INSERT INTO Ships VALUES(1414,'S14','Panama',55000);
  108. ------------------------------------------------------------------------------------
  109. INSERT INTO Docking VALUES(88,5,'15/8/17','15/8/17');
  110. INSERT INTO Docking VALUES(22,1,'17/8/17','18/8/17');
  111. INSERT INTO Docking VALUES(1414,5,'16/8/17','20/8/17');
  112. INSERT INTO Docking VALUES(1010,3,'15/8/17','19/8/17');
  113. INSERT INTO Docking VALUES(99,2,'16/8/17','16/8/17');
  114. INSERT INTO Docking VALUES(33,2,'15/8/17','15/8/17');
  115. INSERT INTO Docking VALUES(66,3,'17/8/17','19/8/17');
  116. INSERT INTO Docking VALUES(1111,5,'16/8/17','16/8/17');
  117. INSERT INTO Docking VALUES(1212,2,'15/8/17','15/8/17');
  118. INSERT INTO Docking VALUES(55,4,'17/8/17','20/8/17');
  119. INSERT INTO Docking VALUES(77,5,'16/8/17','16/8/17');
  120. INSERT INTO Docking VALUES(44,1,'16/8/17','17/8/17');
  121. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  122. ------------------- Part 3 -------------------
  123. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  124.  
  125. select * from Piers;
  126.  
  127.  
  128.  
  129. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  130. ------------------- Part 4 (a) -------------------
  131. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  132.  
  133. -- NORMAL CURSOR
  134.  
  135. DECLARE
  136.  
  137. /* Output variables to hold the result of the query: */
  138. INPUT_PID DOCKING.PID%TYPE;
  139. showSID DOCKING.SID%TYPE;
  140. showPID DOCKING.PID%TYPE;
  141. showARR DOCKING.ARRIVALDATE%TYPE;
  142. showDEP DOCKING.DEPARTUREDATE%TYPE;
  143. CURSOR pat_cursor (INPUT_PID DOCKING.PID%TYPE)
  144. IS
  145. SELECT sid,pid,arrivaldate,departuredate from DOCKING
  146. where
  147. DOCKING.pid=INPUT_PID
  148. and
  149. (DOCKING.departuredate-DOCKING.arrivaldate)=(select max(d1.departuredate-d1.arrivaldate) from DOCKING d1 where d1.PID=INPUT_PID);
  150. BEGIN
  151. INPUT_PID := '&INPUT_PIDQ5';
  152. DBMS_OUTPUT.put_line('This report for pier '||TO_CHAR(INPUT_PID) );
  153. OPEN pat_cursor (INPUT_PID);
  154. LOOP
  155. FETCH pat_cursor INTO showSID,showPID, showARR, showDEP;
  156. EXIT WHEN pat_cursor%NOTFOUND;
  157. DBMS_OUTPUT.put_line(TO_CHAR(showSID) || ' | ' || TO_CHAR(showARR) || ' | ' || TO_CHAR(showDEP) || ' | ' || TO_CHAR(showDEP-showARR) || ' days' );
  158. END LOOP;
  159. CLOSE pat_cursor;
  160. END;
  161. /
  162.  
  163.  
  164. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  165. ------------------- Part 4 (b) -------------------
  166. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  167.  
  168. DECLARE
  169. -- Declare cursor to get employee info
  170. CURSOR Docking_Cursor (INPUT_PID NUMBER)
  171. IS
  172. SELECT sid,pid,arrivaldate,departuredate FROM DOCKING
  173. WHERE pid = INPUT_PID
  174. and
  175. (DOCKING.departuredate-DOCKING.arrivaldate)=(select max(d1.departuredate-d1.arrivaldate) from DOCKING d1 where d1.PID=INPUT_PID);
  176.  
  177. -- Declare record to hold cursor row
  178. r_dock_cur Docking_Cursor%ROWTYPE;
  179. job varchar2(10);
  180. BEGIN
  181. job:='&j';
  182. OPEN Docking_Cursor (job) ;
  183. LOOP
  184. -- Retrieve row from active set
  185. FETCH Docking_Cursor INTO r_dock_cur;
  186. -- Exit loop if last fetch found nothing
  187. EXIT WHEN Docking_Cursor%NOTFOUND;
  188. dbms_output.put_line('Question 4.b');
  189. dbms_output.put_line('This report for pier:'||r_dock_cur.pid);
  190. dbms_output.put_line('sid: '||r_dock_cur.sid || '| ' ||r_dock_cur.arrivaldate || '| ' || r_dock_cur.departuredate || ' | '|| TO_CHAR(r_dock_cur.departuredate - r_dock_cur.arrivaldate) || ' days');
  191. END LOOP;
  192. CLOSE Docking_Cursor;
  193. END;
  194.  
  195.  
  196.  
  197. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  198. ------------------- Part 5 -------------------
  199. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  200. CREATE OR REPLACE PROCEDURE print_ships_list(arrival IN DATE, departure IN DATE) AS
  201. Sname VARCHAR2(20);
  202. Pname VARCHAR2(20);
  203. CURSOR d_cursor IS
  204. SELECT pid, sid, arrivaldate, departuredate FROM docking;
  205. details d_cursor%ROWTYPE;
  206. BEGIN
  207. OPEN d_cursor;
  208. LOOP
  209. FETCH d_cursor INTO details;
  210. IF (details.arrivaldate =arrival AND details.departuredate> departure)or (details.arrivaldate >=arrival AND details.departuredate= departure)THEN
  211. SELECT name INTO Sname FROM ships WHERE details.sid = sid;
  212. SELECT name INTO Pname FROM piers WHERE details.pid = pid;
  213. dbms_output.put_line(Pname || ' | ' || Sname || ' | ' || details.arrivaldate || ' | ' || details.departuredate);
  214. END IF;
  215. EXIT WHEN d_cursor%NOTFOUND;
  216. END LOOP;
  217. CLOSE d_cursor;
  218. END print_ships_list;
  219. /
  220. ---------------------------Helper Procedure -------------------------------------------------------
  221. CREATE OR REPLACE FUNCTION count_ships(arrival IN DATE, departure IN DATE) RETURN INTEGER
  222. IS
  223. day_counter INTEGER;
  224. no_ships EXCEPTION;
  225. BEGIN
  226.  
  227. SELECT COUNT(*) INTO day_counter FROM DOCKING WHERE (arrivaldate =arrival AND departuredate> departure)or (arrivaldate >=arrival AND departuredate= departure);
  228.  
  229. IF day_counter = 0
  230. THEN RAISE no_ships;
  231. END IF;
  232. dbms_output.put_line('From: ' || arrival || 'To: ' || departure);
  233. print_ships_list(arrival, departure);
  234. RETURN day_counter;
  235.  
  236. EXCEPTION
  237. WHEN no_ships THEN RETURN -2;
  238.  
  239.  
  240. END;
  241. /
  242. ---------- PROCEDURE END ----------
  243.  
  244.  
  245. ---------- CALLING PROCEDURE CODE BLOCK ----------
  246.  
  247.  
  248.  
  249.  
  250. SET SERVEROUTPUT ON
  251. accept ar_date prompt 'Arrival Date (dd/mm/yy) ';
  252. accept dep_date prompt 'Departure DATE (dd/mm/yy)';
  253.  
  254. DECLARE
  255. ret_val NUMBER;
  256. ardate DATE:= TO_DATE('&ar_date', 'dd/mm/yy');
  257. depdate DATE:=TO_DATE('&dep_date', 'dd/mm/yy') ;
  258.  
  259. BEGIN
  260. ret_val := count_ships(ardate ,depdate);
  261. IF ret_val = 0 THEN
  262. dbms_output.put_line('There are no ships in period: ' || ardate || ' - ' || depdate);
  263. ELSIF ret_val = -2 THEN
  264. dbms_output.put_line('EXCEOTION : NO SHIPS IN THE PIERS ');
  265. ELSE
  266. dbms_output.put_line('From ' ||ardate || ' To ' || depdate || 'there were ' || ret_val || ' ships');
  267. END IF;
  268. END;
  269. /
  270.  
  271. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  272. ------------------- Part 6 -------------------
  273. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  274. create or replace procedure findShipByName(inp_country Ships.COUNTRY%type)
  275. as
  276. total number;
  277. average number;
  278. BEGIN
  279. total :=0;
  280. average:=0;
  281. for r_ship_rec in
  282. (select d.ARRIVALDATE,d.DEPARTUREDATE,d.sid,d.pid,s.cargo_weight
  283. from DOCKING d, Piers p,Ships s where
  284. p.pid = d.pid
  285. and
  286. s.sid=d.sid
  287. and
  288. s.country=inp_country )
  289. LOOP
  290. total:=total+1;
  291. average:=average+r_ship_rec.cargo_weight;
  292. DBMS_OUTPUT.put_line( r_ship_rec.sid ||' | ' || r_ship_rec.pid|| ' | ' || r_ship_rec.arrivaldate || ' | ' ||r_ship_rec.departuredate);
  293. END LOOP;
  294. if(total>0 and average>0) then
  295. DBMS_OUTPUT.put_line( 'Total Ships: '||total);
  296. DBMS_OUTPUT.put_line( 'Average weight: '||(average/total));
  297. else
  298. DBMS_OUTPUT.put_line( 'ERROR: No Docked Ships from this country. ');
  299. end if;
  300. END findShipByName;
  301. /
  302.  
  303.  
  304. ---------- CALLING PROCEDURE CODE BLOCK ----------
  305. DECLARE
  306. COUNTRY varchar2(20);
  307.  
  308. BEGIN
  309. COUNTRY := ('&cnry');
  310. findShipByName(COUNTRY);
  311. END;
  312. /
  313.  
  314.  
  315.  
  316.  
  317. --------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement