Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 6.72 KB | None | 0 0
  1. --Task 2:
  2. SET SERVEROUTPUT ON;
  3. ALTER session SET nls_date_format = 'dd/mm/yy';
  4. CREATE OR REPLACE TRIGGER docking_trigger
  5. BEFORE INSERT OR UPDATE ON DOCKING
  6. FOR EACH ROW
  7. ENABLE
  8. DECLARE
  9.     s_cargo    SHIPS.cargo_weight%TYPE;
  10.     p_capacity PIERS.capacity%TYPE;
  11. BEGIN
  12.     -- Verifying that [ arrival date <= departure date ]:
  13.     IF (:NEW.arrival_date > :NEW.departure_date) THEN
  14.         DBMS_OUTPUT.put_line('WRONG! :(');
  15.         RAISE_APPLICATION_ERROR(-20500,'Bad Dates: arrival_date Date > departure_date Date.');
  16.     END IF;
  17.     -- Verifying that [ cargo wheight <= capacity ]:
  18.     SELECT SHIPS.cargo_weight INTO s_cargo
  19.     FROM SHIPS
  20.     WHERE SHIPS.sid = :NEW.sid;
  21.     SELECT PIERS.capacity INTO p_capacity
  22.     FROM PIERS
  23.     WHERE PIERS.pid = :NEW.pid;
  24.     IF s_cargo > p_capacity THEN
  25.         DBMS_OUTPUT.put_line('WRONG! :(');
  26.         RAISE_APPLICATION_ERROR(-20500,'Cargo Error: There is not enough capacity for all the cargo.');
  27.     ELSE
  28.         DBMS_OUTPUT.put_line('RIGHT! :)');
  29.         UPDATE PIERS
  30.         SET totalShips = totalShips + 1
  31.         WHERE pid = :NEW.pid;
  32.     END IF;
  33. END;
  34. /
  35. ----------------------------------------------------------------------------------------------------------------------------------------------------------------
  36.  
  37. --Task 4:
  38. -- 4a:
  39. DECLARE
  40.     max_row  DOCKING%ROWTYPE;
  41.     temp DOCKING%ROWTYPE;
  42. CURSOR docking_cursor IS
  43.     SELECT * FROM DOCKING
  44.     WHERE pid = TO_NUMBER('&pierID');
  45. BEGIN
  46.     OPEN docking_cursor;
  47.     FETCH docking_cursor INTO temp;
  48.     max_row := temp;
  49.     DBMS_OUTPUT.put_line('This report for pier ' || temp.pid || ':');
  50.     LOOP
  51.         EXIT WHEN docking_cursor%NOTFOUND;
  52.         IF (temp.departure_date - temp.arrival_date > max_row.departure_date - max_row.arrival_date ) THEN
  53.             max_row := temp;
  54.         END IF;
  55.         FETCH docking_cursor INTO temp;
  56.     END LOOP;
  57.     CLOSE docking_cursor;
  58.     OPEN docking_cursor;
  59.     FETCH docking_cursor INTO temp;
  60.     LOOP
  61.         EXIT WHEN docking_cursor%NOTFOUND;
  62.         IF ( temp.departure_date - temp.arrival_date = max_row.departure_date - max_row.arrival_date ) THEN
  63.             DBMS_OUTPUT.put_line( temp.sid || ' | ' || temp.arrival_date || ' | ' || temp.departure_date || ' | ' || ( temp.departure_date - temp.arrival_date) || ' days.');
  64.         END IF;
  65.         FETCH docking_cursor INTO temp;
  66.     END LOOP;
  67.     CLOSE docking_cursor;
  68.     EXCEPTION
  69.         WHEN OTHERS THEN DBMS_OUTPUT.put_line('Invalid input: Please insert an integer.');
  70. END;
  71. /
  72. -- 4b:
  73. DECLARE
  74.     max_row DOCKING%ROWTYPE;
  75.     counter NUMBER(3) := 0;
  76. CURSOR docking_cursor IS
  77.     SELECT *
  78.     FROM DOCKING
  79.     WHERE pid = TO_NUMBER('&pierID');
  80. BEGIN
  81.     FOR d IN docking_cursor
  82.     LOOP
  83.         IF (counter = 0 ) THEN
  84.             max_row := d;
  85.             counter := 1;
  86.             DBMS_OUTPUT.put_line('This report for pier ' || max_row.pid || ':');
  87.         ELSIF ( d.departure_date - d.arrival_date > max_row.departure_date - max_row.arrival_date ) THEN
  88.             max_row := d;
  89.         END IF;
  90.     END LOOP;
  91.     FOR d IN docking_cursor
  92.     LOOP
  93.         IF( d.departure_date - d.arrival_date = max_row.departure_date - max_row.arrival_date ) THEN
  94.             DBMS_OUTPUT.put_line(d.sid || ' | ' || d.arrival_date || ' | ' || d.departure_date || ' | ' || (d.departure_date - d.arrival_date) || ' days');
  95.         END IF;
  96.     END LOOP;
  97.     EXCEPTION
  98.         WHEN OTHERS THEN DBMS_OUTPUT.put_line('Invalid input: please insert an integer');
  99. END;
  100. /
  101. ----------------------------------------------------------------------------------------------------------------------------------------------------------------
  102. --Task 5:
  103. CREATE OR REPLACE FUNCTION countShips(arrival DOCKING.arrival_date%TYPE, departure DOCKING.departure_date%TYPE)
  104. RETURN NUMBER IS
  105.     counter NUMBER := 0;
  106.     NULL_SHIPS EXCEPTION;
  107. CURSOR docking_cursor IS
  108.     SELECT *
  109.     FROM DOCKING;
  110. BEGIN
  111.     SELECT COUNT(*) INTO counter
  112.     FROM DOCKING
  113.     WHERE ( arrival_date <= arrival AND departure_date >= departure );
  114.     IF(counter = 0) THEN
  115.         RAISE NULL_SHIPS;
  116.     ELSE
  117.         printShips(arrival,departure);
  118.         RETURN counter;
  119.     END IF;
  120.     EXCEPTION
  121.         WHEN NULL_SHIPS THEN
  122.             RETURN -2;
  123. END;
  124. /
  125.  
  126. CREATE OR REPLACE PROCEDURE printShips(arrival DOCKING.arrival_date%TYPE, departure DOCKING.departure_date%TYPE) IS
  127.     p_name PIERS.name%TYPE;
  128.     s_name SHIPS.name%TYPE;
  129.     CURSOR docking_cursor IS
  130.     SELECT *
  131.     FROM DOCKING;
  132. BEGIN
  133.     FOR d IN docking_cursor
  134.     LOOP
  135.         IF(d.arrival_date <= arrival AND d.departure_date >= departure) THEN
  136.             SELECT SHIPS.name INTO s_name
  137.             FROM SHIPS
  138.             WHERE SHIPS.sid = d.sid;
  139.             SELECT PIERS.name INTO p_name
  140.             FROM PIERS
  141.             WHERE PIERS.pid = d.pid;
  142.             DBMS_OUTPUT.put_line(p_name || ' | ' || s_name || ' | ' || d.arrival_date || ' | ' || d.departure_date);            
  143.         END IF;
  144.     END LOOP;
  145. END;
  146. /
  147. DECLARE
  148.     counter NUMBER := 0;
  149.     arrival DOCKING.arrival_date%TYPE;
  150.     departure DOCKING.departure_date%TYPE;
  151. BEGIN
  152.     arrival := '&Arrival';
  153.     departure := '&Departure';
  154.     DBMS_OUTPUT.put_line('From: ' || arrival);
  155.     DBMS_OUTPUT.put_line('To: ' || departure);
  156.     counter := countShips(arrival, departure);
  157.     IF(counter = -2 ) THEN
  158.         DBMS_OUTPUT.put_line('There are no ships in period: ' || arrival || '-' || departure);
  159.     ELSE
  160.         DBMS_OUTPUT.put_line('From ' || arrival || ' there were ' || counter || ' ships.');
  161.     END IF;
  162. END;
  163. /
  164. ----------------------------------------------------------------------------------------------------------------------------------------------------------------
  165. --Task 6:
  166. CREATE OR REPLACE PROCEDURE printDocks(c SHIPS.country%TYPE) IS
  167.     counter NUMBER := 0;
  168.     temp    NUMBER := 0;
  169.     avrg    NUMBER := 0;
  170.     NULL_SHIPS EXCEPTION;
  171. CURSOR docking_cursor IS
  172.     SELECT *
  173.     FROM DOCKING
  174.     WHERE sid IN (
  175.         SELECT sid
  176.         FROM SHIPS
  177.         WHERE country = c
  178.     );
  179. BEGIN
  180.     FOR dc IN docking_cursor
  181.     LOOP
  182.         SELECT cargo_weight
  183.         INTO temp
  184.         FROM SHIPS
  185.         WHERE sid = dc.sid;
  186.         avrg := avrg + temp;
  187.         DBMS_OUTPUT.put_line(dc.sid || ' | ' || dc.pid || ' | ' || dc.arrival_date || ' | ' || dc.departure_date);
  188.         counter := counter + 1;
  189.     END LOOP;
  190.     IF(counter = 0) THEN
  191.         RAISE NULL_SHIPS;
  192.     ELSE
  193.         DBMS_OUTPUT.put_line('Total ships: ' || counter);
  194.         DBMS_OUTPUT.put_line('Avarage weight: ' || avrg/counter);
  195.     END IF;
  196.     EXCEPTION
  197.         WHEN NULL_SHIPS THEN
  198.             DBMS_OUTPUT.put_line('There is no information about ships from ' || c || '.');
  199. END;
  200. /
  201.  
  202. BEGIN
  203.     printDocks('&Country');
  204. END;
  205. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement