Guest User

Untitled

a guest
Apr 20th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 10.88 KB | None | 0 0
  1. --- **********************************************************************************
  2. ---
  3. --- VORBEREITUNGS-STATEMENTS
  4. --- Originaltabellen werden kopiert
  5. ---
  6. ---
  7. --- **********************************************************************************
  8. DROP TABLE if11b022_flug;
  9. DROP TABLE if11b022_passagierliste;
  10. DROP TABLE if11b022_gepaeck;
  11.  
  12. CREATE TABLE if11b022_crew AS SELECT * FROM crew;
  13. CREATE TABLE if11b022_flug AS SELECT * FROM flug;
  14. CREATE TABLE if11b022_passagierliste AS SELECT * FROM passagierliste;
  15. CREATE TABLE if11b022_gepaeck AS SELECT * FROM gepaeck;
  16.  
  17. --- **********************************************************************************
  18. --- 1)
  19. --- Schreiben Sie ein Package, das Flugänderungen implementiert:
  20. --- Dieses Package soll folgende Funktionalitäten beinhalten: (Überlegen Sie sich jeweils geeignete Parameter!)
  21. --- a. ÄnderungdesAbfluggateseinesFluges(2P.)
  22. --- b. AnlegeneinesneuenFluges(2P.)
  23. --- c. Manuelles Umbuchen von Passagieren (inkl. Gepäck!) (2P.)
  24. --- **********************************************************************************
  25. CREATE OR REPLACE PACKAGE if11b022_pkg_bsp1 AS
  26.     PROCEDURE gate_aendern(a_flugID IN NUMBER, a_gateID IN NUMBER);
  27.   PROCEDURE flug_anlegen(a_flugzeugID IN NUMBER, a_gateID IN NUMBER, a_flughafen_abflug IN NUMBER, a_flughafen_destination IN NUMBER, a_abflugzeit IN TIMESTAMP, a_flugnummer IN VARCHAR2, a_dauer IN NUMBER);
  28.     PROCEDURE passagier_umbuchen(a_flugID IN NUMBER, a_personID IN NUMBER, a_new_flugID IN NUMBER);
  29. END if11b022_pkg_bsp1;
  30. /
  31.  
  32. CREATE OR REPLACE PACKAGE BODY if11b022_pkg_bsp1 AS
  33.     PROCEDURE gate_aendern(a_flugID IN NUMBER, a_gateID IN NUMBER) IS
  34.  
  35.     BEGIN
  36.     UPDATE if11b022_flug SET gateID = a_gateID WHERE flugID = a_flugID;
  37.  
  38.   EXCEPTION
  39.     WHEN NO_DATA_FOUND THEN
  40.       raise_application_error(-20100, 'FlugID und/oder GateID ungueltig');
  41.     WHEN OTHERS THEN
  42.       raise_application_error(-20101, 'Unerwarteter Fehler ist aufgetreten');
  43.   END;
  44.  
  45.   PROCEDURE flug_anlegen(a_flugzeugID IN NUMBER, a_gateID IN NUMBER, a_flughafen_abflug IN NUMBER, a_flughafen_destination IN NUMBER, a_abflugzeit IN TIMESTAMP, a_flugnummer IN VARCHAR2, a_dauer IN NUMBER) IS
  46.   v_check NUMBER;
  47.   ex_no_flugzeug EXCEPTION;
  48.   ex_no_gate EXCEPTION;
  49.   ex_no_flughafen_abflug EXCEPTION;
  50.   ex_no_flughafen_destination EXCEPTION;
  51.   BEGIN
  52.     SELECT COUNT(*) INTO v_check FROM flugzeug WHERE flugzeug.flugzeugID = a_flugzeugID;
  53.     IF v_check <= 0 THEN
  54.       RAISE ex_no_flugzeug;
  55.     END IF;
  56.    
  57.     SELECT COUNT(*) INTO v_check FROM gate WHERE gate.gateID = a_gateID;
  58.     IF v_check <= 0 THEN
  59.       RAISE ex_no_gate;
  60.     END IF;
  61.    
  62.     SELECT COUNT(*) INTO v_check FROM flughafen WHERE flughafen.flughafenID = a_flughafen_abflug;
  63.     IF v_check <= 0 THEN
  64.       RAISE ex_no_flughafen_abflug;
  65.     END IF;
  66.    
  67.     SELECT COUNT(*) INTO v_check FROM flughafen WHERE flughafen.flughafenID = a_flughafen_destination;
  68.     IF v_check <= 0 THEN
  69.       RAISE ex_no_flughafen_destination;
  70.     END IF;
  71.    
  72.     INSERT INTO if11b022_flug (flugID, flugzeugID, gateID, flughafen_abflug, flughafen_destination, abflugzeit, flugnummer, dauer)
  73.     VALUES ((SELECT MAX(flugID)+1 FROM if11b022_flug), a_flugzeugID, a_gateID, a_flughafen_abflug, a_flughafen_destination, a_abflugzeit, a_flugnummer, a_dauer);
  74.    
  75.     EXCEPTION
  76.       WHEN ex_no_flugzeug THEN
  77.         raise_application_error(-20100, 'Flugzeug existiert nicht!');
  78.       WHEN ex_no_gate THEN
  79.         raise_application_error(-20101, 'Gate existiert nicht!');
  80.       WHEN ex_no_flughafen_abflug THEN
  81.         raise_application_error(-20102, 'Abflug-Flughafen existiert nicht!');
  82.       WHEN ex_no_flughafen_destination THEN
  83.         raise_application_error(-20103, 'Ziel-Flughafen existiert nicht!');
  84.       WHEN OTHERS THEN
  85.         raise_application_error(-20104, 'Unerwarteter Fehler ist aufgetreten');
  86.   END;
  87.  
  88.   PROCEDURE passagier_umbuchen(a_flugID IN NUMBER, a_personID IN NUMBER, a_new_flugID IN NUMBER) IS
  89.     v_check NUMBER;
  90.     ex_no_flug EXCEPTION;
  91.     ex_no_passagier EXCEPTION;
  92.     ex_no_seats EXCEPTION;
  93.   BEGIN
  94.    
  95.     SELECT COUNT(*) INTO v_check FROM if11b022_flug f WHERE f.flugID = a_flugID OR f.flugID = a_new_flugID;
  96.     IF v_check <= 1 THEN
  97.       RAISE ex_no_flug;
  98.     END IF;
  99.    
  100.     SELECT COUNT(*) INTO v_check FROM if11b022_passagierliste pl WHERE pl.personID = a_personID AND pl.flugID = a_flugID;
  101.     IF v_check <= 0 THEN
  102.       RAISE ex_no_passagier;
  103.     END IF;
  104.    
  105.     SELECT (fzt.sitzplaetze - COUNT(pl.flugID)) INTO v_check
  106.     FROM flugzeugtyp fzt, flugzeug fz, if11b022_flug f, if11b022_passagierliste pl
  107.     WHERE fzt.flugzeugtypID = fz.flugzeugtypID
  108.       AND fz.flugzeugID = f.flugzeugID
  109.       AND pl.flugID = f.flugID
  110.       AND f.flugID = a_new_flugID
  111.     GROUP BY f.flugID, fzt.sitzplaetze;
  112.    
  113.     IF v_check <= 0 THEN
  114.       RAISE ex_no_seats;
  115.     END IF;
  116.    
  117.     UPDATE if11b022_passagierliste SET flugID = a_new_flugID
  118.     WHERE flugID = a_flugID AND personID = a_personID;
  119.    
  120.     UPDATE if11b022_gepaeck SET flugID = a_new_flugID
  121.     WHERE flugID = a_flugID AND personID = a_personID;
  122.    
  123.     EXCEPTION
  124.       WHEN ex_no_passagier THEN
  125.         raise_application_error(-20100, 'Passagier zu angegebenen Flug existiert nicht');
  126.       WHEN ex_no_flug THEN
  127.         raise_application_error(-20101, 'Alter oder neuer Flug existiert nicht!');
  128.       WHEN ex_no_seats THEN
  129.         raise_application_error(-20102, 'Keine Sitze mehr im neuen Flug verfuegbar!');
  130.       WHEN OTHERS THEN
  131.         raise_application_error(-20104, 'Unerwarteter Fehler ist aufgetreten');
  132.   END;
  133.  
  134. END;
  135. /
  136.  
  137. --- Testen der Proceduren im Package
  138. EXECUTE if11b022_pkg_bsp1.gate_aendern(1, 1);
  139. EXECUTE if11b022_pkg_bsp1.flug_anlegen(12,1,1,115,SYSDATE,'NEW123', 5);
  140. EXECUTE if11b022_pkg_bsp1.passagier_umbuchen(1,5,16);
  141.  
  142. --- **********************************************************************************
  143. --- 2)
  144. --- Schreiben Sie einen Datenbanktrigger, der im Falle einer Stornierung eines Passagiers
  145. --- zu einem Flug dafür sorgt, dass alle Gepäckstücke des Passagiers aus der Gepäcktabelle entfernt werden.
  146. --- **********************************************************************************
  147.  
  148. CREATE OR REPLACE TRIGGER if11b022_passagierstornierung BEFORE DELETE
  149. ON if11b022_passagierliste FOR EACH ROW
  150. DECLARE
  151.  
  152. BEGIN
  153.   DELETE FROM if11b022_gepaeck WHERE personID = :OLD.personID AND flugID = :OLD.flugID;
  154. END;
  155. /
  156.  
  157. -- Testen des Triggers
  158. DELETE FROM if11b022_passagierliste WHERE flugID = 16 AND personID = 5;
  159.  
  160.  
  161. --- **********************************************************************************
  162. --- 3)
  163. --- Schreiben Sie einen Datenbanktrigger, der im Falle einer Flugstornierung alle gebuchten Passagiere
  164. --- auf andere Flüge mit gleicher Destination umbucht. Vergessen Sie nicht auf das Gepäck!
  165. --- Nicht verbuchbare Passagiere geben Sie auf der Konsole aus.
  166. --- **********************************************************************************
  167. CREATE OR REPLACE TRIGGER if11b022_flugstornierung BEFORE DELETE
  168. ON if11b022_flug FOR EACH ROW
  169. DECLARE
  170.  
  171. v_freiePlaetze NUMBER;
  172.  
  173. CURSOR cur_fluege IS
  174.   SELECT f.flugID FROM flug f
  175.     WHERE f.flughafen_destination = :OLD.flughafen_destination;
  176.    
  177. CURSOR cur_personen IS
  178.   SELECT p.personID FROM person p
  179.   JOIN passagierliste pl ON pl.personID = p.personID
  180.   JOIN flug f ON f.flugID = pl.flugID
  181.   WHERE f.flugID = :OLD.flugID;
  182.  
  183. v_person cur_personen%ROWTYPE;
  184. v_flug cur_fluege%ROWTYPE;
  185.  
  186. BEGIN
  187.   -- Passagiere auf alle moeglichen Alternativfluege verteilen
  188.   FOR v_flug IN cur_fluege
  189.   LOOP
  190.     --Anzahl der Sitzplaetze ermitteln
  191.     SELECT (fzt.sitzplaetze - COUNT(pl.flugID)) INTO v_freiePlaetze
  192.     FROM flugzeugtyp fzt, flugzeug fz, if11b022_flug f, if11b022_passagierliste pl
  193.     WHERE fzt.flugzeugtypID = fz.flugzeugtypID
  194.       AND fz.flugzeugID = f.flugzeugID
  195.       AND pl.flugID = f.flugID
  196.       AND f.flugID = v_flug.flugID
  197.     GROUP BY f.flugID, fzt.sitzplaetze;
  198.    
  199.     -- Fuer jeden freien Sitzplatz einen Passagier zuweisen
  200.     FOR v_i IN 1..v_freiePlaetze
  201.     LOOP
  202.       FOR v_person IN cur_personen
  203.       LOOP
  204.         UPDATE if11b022_passagierliste pl SET pl.flugID = v_flug.flugID
  205.         WHERE flugID = :OLD.flugID AND pl.personID = v_person.personid;
  206.        
  207.         UPDATE if11b022_gepaeck g SET g.flugID = v_flug.flugID
  208.         WHERE flugID = :OLD.flugID AND g.personID = v_person.personID;
  209.       END LOOP;
  210.     END LOOP;
  211.    
  212.    
  213.   END LOOP;
  214.  
  215.   -- Nicht umbuchbaren Passagiere ausgeben
  216.   FOR v_person IN cur_personen
  217.   LOOP
  218.     dbms_output.enable;
  219.     dbms_output.put_line('Passagier nicht umgebucht! ID: ' || v_person.personid);
  220.   END LOOP;
  221.  
  222. END;
  223. /
  224.  
  225.  
  226. EXECUTE if11b022_pkg_bsp1.flug_anlegen(12,1,1,120,SYSDATE,'ER60', 5);
  227. SET serveroutput ON;
  228. DELETE FROM if11b022_flug WHERE flugID = 16;
  229. SELECT * FROM if11b022_passagierliste WHERE flugID = 16;
  230.  
  231. --- **********************************************************************************
  232. --- 4)
  233. --- Schreiben Sie einen Datenbanktrigger, der bei der Zuteilung von Personal zu einem Flug prüft,
  234. --- dass pro Flug nicht mehr als ein Pilot od. Chefpilot, zwei Co- Piloten und
  235. --- 6 Flugbegleiter zugeordnet werden.
  236. --- **********************************************************************************
  237. CREATE OR REPLACE TRIGGER if11b022_flugpersonalcheck BEFORE INSERT OR UPDATE
  238. ON if11b022_crew FOR EACH ROW
  239. DECLARE
  240.   v_piloten NUMBER;
  241.   v_copiloten NUMBER;
  242.   v_flugbegleiter NUMBER;
  243.   v_kbz VARCHAR2(5);
  244.  
  245. BEGIN
  246.   SELECT d.kbz INTO v_kbz FROM flugpersonal fp
  247.   JOIN dienstrang d ON d.dienstrangID = fp.dienstrangID
  248.   WHERE fp.personID = :NEW.personID;
  249.  
  250.   SELECT COUNT(d.dienstrangID) INTO v_piloten FROM if11b022_crew c
  251.   JOIN flugpersonal fp ON fp.personID = c.personID
  252.   JOIN dienstrang d ON d.dienstrangID = fp.dienstrangID
  253.   WHERE c.flugID = :NEW.flugID AND (d.kbz = 'Cp' OR d.kbz = 'Pl');
  254.  
  255.   SELECT COUNT(d.dienstrangID) INTO v_copiloten FROM if11b022_crew c
  256.   JOIN flugpersonal fp ON fp.personID = c.personID
  257.   JOIN dienstrang d ON d.dienstrangID = fp.dienstrangID
  258.   WHERE c.flugID = :NEW.flugID AND d.kbz = 'Co';
  259.  
  260.   SELECT COUNT(d.dienstrangID) INTO v_flugbegleiter FROM if11b022_crew c
  261.   JOIN flugpersonal fp ON fp.personID = c.personID
  262.   JOIN dienstrang d ON d.dienstrangID = fp.dienstrangID
  263.   WHERE c.flugID = :NEW.flugID AND d.kbz LIKE '%Bp%';
  264.  
  265.   IF v_piloten >= 1 AND (v_kbz = 'Cp' OR v_kbz = 'Pl') THEN
  266.     raise_application_error(-20100, 'Es duerfen nicht mehr als 1 Pilot oder Chefpilot an Board sein');
  267.   END IF;
  268.  
  269.   IF v_copiloten >= 2 AND v_kbz = 'Co' THEN
  270.     raise_application_error(-20101, 'Es duerfen nicht mehr als 2 Co-Piloten an Board sein');
  271.   END IF;
  272.  
  273.   IF v_flugbegleiter >= 6 AND v_kbz = 'Bp' THEN
  274.     raise_application_error(-20102, 'Es fuerfen nicht mehr als 6 Flugbegleiter an Board sein');
  275.   END IF;
  276.  
  277. END;
  278.  
  279. -- Test
  280. INSERT INTO if11b022_crew (personID, flugID) VALUES ( 3, 16);
  281. INSERT INTO if11b022_crew (personID, flugID) VALUES ( 88, 16);
Add Comment
Please, Sign In to add comment