Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.75 KB | None | 0 0
  1. --Bitte beim kopieren so lieb sein und soviele variabelnnamen und strings und was weis ich noch alles ändern! bitte aufpassen bei beispiel 3 und 6!!!
  2. --3 und 6 würd ich eher als schwer einstufen hab hier aber versucht meinen lösungsweg bestmöglich zu erklären.
  3. --bei fehlern in meinem code bitte bescheid sagen,... uU hab ich die angabe missverstanden oder es gibt eine bessere und/oder leichtere lösung. daher alles ohne gewähr.
  4.  
  5.  
  6. Set SERVEROUTPUT on; --NICHT VERGESSEN!!! muss einmalig nach anmelden aufgerufen werden damit dbms_output.put_line() funktioniert
  7.  
  8. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  9. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  10. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  11.  
  12. --und HERE WE GO!!!
  13.  
  14. -- 1. Schreiben Sie einen anonymen Block, welcher eine Variable „v_personID“ deklariert, diese mit dem höchsten Eintrag der personID
  15. -- aus der Tabelle person befüllt und ausgibt.
  16. DECLARE
  17. v_personID INT;
  18. BEGIN
  19. select max(personID) into v_personID from person;
  20. dbms_output.put_line('Höchster Eintrag von persID: ' || v_personID);
  21. END;
  22. / --gg ez
  23. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  24. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  25. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  26.  
  27. -- 2. Schreiben Sie einen anonymen Block, welcher das Verhältnis zwischen Flugpersonal und Bodenpersonal
  28. -- ausgibt (z.B.: “flugpersonal : bodenpersonal = 10:24”). Verwenden Sie dafür mindestens 2 verschiedene Select Statements.
  29.  
  30. DECLARE
  31. v_flugPers INT;
  32. v_bodenPers INT;
  33. BEGIN
  34. select count(personID) into v_flugPers from flugpersonal;
  35. select count(personID) into v_bodenPers from bodenpersonal;
  36. dbms_output.put_line('flugpersonal : bodenpersonal = ' || v_flugPers || ':' || v_bodenPers);
  37. END;
  38. /
  39. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  40. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  41. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  42.  
  43. --3. Schreiben Sie eine Datenbankprozedur, welche die Daten eines Passagiers auf einem bestimmten Sitzplatz eines Fluges ausgibt.
  44. -- Deklarieren Sie dazu mindestens die beiden Variablen v_flugnummer und v_sitzplatz und weisen Sie diesen Werte zu.
  45. -- Ausgegeben werden sollen die Flugnummer, der Passagiername, sein Sitzplatz, seine Landeszugehörigkeit (sofern vorhanden),
  46. -- seine Reisepassnummer und das Gesamtgewicht seines Gepäcks. Ist der Platz noch frei, geben Sie 0 aus.
  47. -- Überlegen Sie sich wo und wie es zu Fehlerfällen kommen kann (z.B. mehrere Reisepassnummern).
  48. -- Überprüfen Sie auf diese Fehlerfälle und geben, wenn einer Eintritt, -1 aus. Verwenden Sie noch kein explizites Exception Handling!
  49.  
  50. --NOTE: tricky! vorweg ein paar infos! für den output verwende ich chr(10) das is der 10. char im ascii und macht nix anderes als einen zeilenumbruch! also rein für formatierung.
  51. --der erste code hier gibt nur alles gefragte aus, sofern die datensätze auch vorhanden sind und keine fehler auftreten, ich hab mir dafür eine flugnummer rausgesucht die existiert
  52. --und einen sitzplatz auf dem tatsächlich ein passagier drauf sitzt! das alleine find ich schon komplex genug für das zusätzlich gefragte fehler handling (OHNE EXCEPTIONS -> fml[wär soviel einfacher mit])
  53. --schreib ich das ganze nochmal in einen separaten code mit daten.
  54. --aber hier einmal eine fast/beinahe lösung:
  55. CREATE or REPLACE
  56. PROCEDURE procPassAufSitzplatz
  57. IS
  58. v_flugnummer flug.flugnummer%type :='OS7511';
  59. v_sitzplatz VARCHAR2(10):='217B';
  60.  
  61. v_bezeichnung land.bezeichnung%TYPE;
  62. v_reisepassnr reisepass.reisepassnr%type;
  63. v_vorname person.vorname%type;
  64. v_nachname person.nachname%type;
  65. v_gewicht gepaeck.gewicht%type;
  66.  
  67. BEGIN
  68. --ich versuch mal das select statement zu erklären:
  69. --in pl/sql braucht ein select statement auch mmer ein into,.. sonst schreit er aber subselects brauchen keins!
  70. --ganz innen drin hol ich mir alles was ich brauch, summiere bei mehreren einträgen das giwicht und gruppier das ganze.
  71. -- ich kann leider innen drin alle werte noch nicht in variablen abspeichern. mag er nicht. muss ja auch erst die summe und das gruppieren abschliesen. also ich versteh ihn schon warum er nicht mag.
  72. --der summe gewicht geb ich einen alias sum_gew und diesen nutz ich dann im äußeren statement um mittels into diesen und andere werte in variablen zu speichern, der rest is glaub ich logisch
  73. select bezeichnung, reisepassnr, vorname, nachname, sum_gew
  74. into v_bezeichnung, v_reisepassnr, v_vorname, v_nachname, v_gewicht from (
  75. select flugnummer, bezeichnung, reisepassnr, vorname, nachname, sitzplatznummer, SUM(gewicht) as sum_gew from land join reisepass using(landid)
  76. join person using(personID) join passagierliste using (personID) join flug using (flugID) join gepaeck using (personID)
  77. group by flugnummer, bezeichnung, reisepassnr, vorname, nachname, sitzplatznummer)
  78. where flugnummer = v_flugnummer AND Sitzplatznummer = v_sitzplatz;
  79.  
  80. dbms_output.put_line('-----------------------------------------' ||chr(10)); --just4fun um den konsolen output von den restlichen automatischen msg abzugrenzen chr(10) macht einen zeilenumbruch. kA obs da nicht eine bessere möglichkeit gibt. \n funktioniert nicht, hab ich probiert.
  81.  
  82. dbms_output.put_line('Flugnummer: ' || v_flugnummer || chr(10) || --einfach alles zusammengestückelt und ausgegeben.
  83. 'Name: ' || v_vorname || ' ' || v_nachname || chr(10) ||
  84. 'Sitzplatz: ' || v_sitzplatz || chr(10) ||
  85. 'Landeszugehörigkeit: ' || v_bezeichnung || chr(10) ||
  86. 'Reisepassnr: ' || v_reisepassnr || chr(10) ||
  87. 'Gesammtgewicht des Gepäcks: ' || v_gewicht || 'kg');
  88.  
  89. dbms_output.put_line('-----------------------------------------' ||chr(10));
  90.  
  91. END;
  92. /
  93. exec procPassAufSitzplatz; --oben wurde die procedure nur erstellt,... ohne diese zeile sieht man nix!
  94.  
  95.  
  96. -------------------------------
  97. -------------------------------
  98.  
  99. --ok. jetzt ein bisschen mehr ins detail! als erstes mittels dem folgenden statement seh ich das es für ganz unterschiedliche flüge die selbe reisepassnummer gibt.
  100. --warum? da ein und die selbe person auch mehrere flüge gebucht haben kann. hier ein statement womit ich das rauslesen kann:
  101. select distinct flugnummer, bezeichnung, reisepassnr, vorname, nachname, sitzplatznummer
  102. from land join reisepass using(landid)
  103. join person using(personID)
  104. join passagierliste using (personID)
  105. join flug using (flugID)
  106. join gepaeck using (personID);
  107. --jedoch sind ja die flugnummern eine andere! wie kann mir das jetzt genau schwierigkeiten bereiten?
  108. --in meiner methode (glaub ich) KAUM (also ich persönlich seh nicht wirklich ein problem) aber falls ich tatsächlich (obwohl ich nach flugnummer AND sitzplatznummer) filter dann trotzdem 2 datensätze zurückbekommen würd
  109. --was ich mir zwar nicht vorstellen kann, aber nur mal angenommen die selbe person mit der selben reisepassnummer bucht sich irgendwie 2 mal in mein system ein sogar auf den selben sitzplatz,
  110. -- (was wiederum durch foreign key constraints schonmal prizipiel nicht gehen sollte) dann könnts mir das progrmm crashen.
  111. --alle anderen eventualitäten sollt ich mit dem folgenden code abgecheckt haben:
  112.  
  113. CREATE or REPLACE
  114. PROCEDURE procPassAufSitzplatz
  115. IS
  116. v_flugnummer flug.flugnummer%type :='AF3012';
  117. v_sitzplatz VARCHAR2(10):='18';
  118.  
  119. v_bezeichnung land.bezeichnung%TYPE;
  120. v_reisepassnr reisepass.reisepassnr%type;
  121. v_vorname person.vorname%type;
  122. v_nachname person.nachname%type;
  123. v_gewicht gepaeck.gewicht%type;
  124. v_platzCount INT;
  125. v_fehler BOOLEAN := false;
  126.  
  127. BEGIN
  128. select count(*) into v_platzCount from land join reisepass using(landid) --ich check hier eigentlich nur obs einen eintrag für die flugnummer UND einen sitzplatz gibt! wenn nicht gibts entweder niemanden auf dem sitzplatz oder es gibt den ganzen flug garnicht
  129. join person using(personID) join passagierliste using (personID) join flug using (flugID)
  130. where flugnummer = v_flugnummer AND Sitzplatznummer = v_sitzplatz;
  131. if v_platzCount = 0 then --naja da 0 bedeutet oben gibts mal keinen eintrag dazu, also is schon irgendwas mit der eingabe falsch vielleicht kein datensatz auf diesem sitzplatz aber auch möglich das die flugnummer falsch eingegeben wurde
  132. select count(*) into v_platzCount from land join reisepass using(landid) --hier check ich im detail ob es an der flugnummer gelegen hat, dass ich hier gelandet bin wenn ja hats einen fehler, wenn nein ist ganz einfach kein mensch auf den sitzplatz draufgebucht und der sitzplatz ist nich frei; hier werden jedoch nur die datensätze gezählt,.. die entscheidung folgt unten in der if
  133. join person using(personID) join passagierliste using (personID) join flug using (flugID)
  134. where flugnummer = v_flugnummer;
  135.  
  136. if v_platzCount = 0 then --OJEOJE nicht der sitzplatz is das problem sondern die ganze flugnummer gibt schon garkeinen wert zurück also hab ich irgendeinen fehler,... ich setz bool v_fehler auf true damit wird am ende ganz einfach -1 ausgegeben
  137. v_fehler:=TRUE;
  138. else
  139. dbms_output.put_line('-----------------------------------------' ||chr(10));
  140. dbms_output.put_line('0 (Dieser Sitzplatz ist frei)' ||chr(10)); --wenn ich bis hierher komm, gab es keinen sitzplatz eintrag jedoch existiert der flug ergo ist der angegeben sitzplatz frei und 0 wird ausgegeben
  141. dbms_output.put_line('-----------------------------------------' ||chr(10));
  142. end if;
  143. else
  144. select count(*) into v_platzCount from land join reisepass using(landid) --zählen der ergebnise um zu sehen ob ich ein duplikat hab ACHTUNG: der join mit gepäck wurde rausgegeben, da bei mehreren gepäckstücken sofort auch mehrere einträge entstehen würden
  145. join person using(personID) join passagierliste using (personID) join flug using (flugID)
  146. where flugnummer = v_flugnummer AND Sitzplatznummer = v_sitzplatz;
  147. if v_platzCount=1 then --normalerweise sollte genau ein datensatz übrig bleiben,... und somit dürft es keine probleme im weiteren verlauf geben
  148. select bezeichnung, reisepassnr, vorname, nachname, sum_gew
  149. into v_bezeichnung, v_reisepassnr, v_vorname, v_nachname, v_gewicht from (
  150. select flugnummer, bezeichnung, reisepassnr, vorname, nachname, sitzplatznummer, SUM(gewicht) as sum_gew from land join reisepass using(landid)
  151. join person using(personID) join passagierliste using (personID) join flug using (flugID) join gepaeck using (personID)
  152. group by flugnummer, bezeichnung, reisepassnr, vorname, nachname, sitzplatznummer)
  153. where flugnummer = v_flugnummer AND Sitzplatznummer = v_sitzplatz;
  154.  
  155. dbms_output.put_line('-----------------------------------------' ||chr(10));
  156. dbms_output.put_line('Flugnummer: ' || v_flugnummer || chr(10) ||
  157. 'Name: ' || v_vorname || ' ' || v_nachname || chr(10) ||
  158. 'Sitzplatz: ' || v_sitzplatz || chr(10) ||
  159. 'Landeszugehörigkeit: ' || v_bezeichnung || chr(10) ||
  160. 'Reisepassnr: ' || v_reisepassnr || chr(10) ||
  161. 'Gesammtgewicht des Gepäcks: ' || v_gewicht || 'kg');
  162. dbms_output.put_line('-----------------------------------------' ||chr(10));
  163. else
  164. v_fehler:=TRUE;
  165. end if;
  166. end if;
  167. if v_fehler then --ich komm hier nur rein wenn irgendwo ein fehler ausfindig gemacht wurde und die boolsche variable auf true gesetzt wurde. Um diese variable auf true zu setzten gibt es unzählige möglichkeiten. der fantasie sind keine grenzen gesetzt! ich kann alle eventualitäten abfragen die mir nur irgendwie in den sinn kommen.
  168. dbms_output.put_line('-----------------------------------------' ||chr(10));
  169. dbms_output.put_line('-1 (FEHLER)' ||chr(10));
  170. dbms_output.put_line('-----------------------------------------' ||chr(10));
  171. end if;
  172. END;
  173. /
  174. exec procPassAufSitzplatz;
  175. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  176. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  177. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  178.  
  179. --4. Schreiben Sie eine Datenbankfunktion, welche die Anzahl der verschiedenen Ortsnamen zurück gibt.
  180. -- Sollten keine Namen verfügbar sein, dann soll -1 zurück gegeben werden.
  181.  
  182. CREATE or REPLACE
  183. FUNCTION funcOrtsnamen
  184. RETURN NUMBER
  185. IS
  186. v_anzahl NUMBER;
  187. BEGIN
  188. select count(plz) into v_anzahl from ort;
  189.  
  190. if v_anzahl = 0 THEN
  191. return -1;
  192. else
  193. return v_anzahl;
  194. end if;
  195. END;
  196. /
  197. SELECT funcOrtsnamen as "Anzahl Ortsnamen" from DUAL;
  198. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  199. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  200. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  201.  
  202. --5. Schreiben Sie eine Datenbankprozedur, welche alle Dienstränge (dienstrangID, kbz und bezeichnung) für die IDs von 100 bis 110 ausschreibt.
  203. -- Sollte eine dienstrangID in diesem Bereich nicht vorhanden sein, dann schreiben Sie stattdessen “kein Dienstrang verfügbar für ID: xxx” aus.
  204.  
  205. CREATE or REPLACE
  206. PROCEDURE procDienst
  207. IS
  208. v_kbz dienstrang.kbz%TYPE;
  209. v_bezeichnung dienstrang.bezeichnung%TYPE;
  210. v_test int;
  211. BEGIN
  212. FOR i IN 100..110 --i ist meine zählvariable aber auch die dienstrangID
  213. LOOP
  214. select count(dienstrangID) into v_test from dienstrang WHERE dienstrangID = i; --hier schau ich nur ob das select statement überhaubt einen eintrag rausgibt wenn nicht dann is v_test = 0
  215. if(v_test = 1) then --wenn ich doch einen wert finde kann ich nun die folgenden select statement anwenden ohne dass das programm crashed
  216. select kbz into v_kbz from dienstrang WHERE dienstrangID = i; --das if drumherum bräucht ich nicht, sofern daten vorhanden wären,... aber CRAAASH wenn er keine daten findet!!!
  217. select bezeichnung into v_bezeichnung from dienstrang WHERE dienstrangID = i; --same here
  218.  
  219. dbms_output.put_line('DienstrangID: ' || i || ', | KBZ: ' || v_kbz || ', | BEZEICHNUNG: ' || v_bezeichnung);
  220. else
  221. dbms_output.put_line('kein Dienstrang verfügbar für ID: ' || i);
  222. end if;
  223.  
  224. END LOOP;
  225. END;
  226. /
  227. exec procDienst;
  228. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  229. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  230. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  231.  
  232. --6. Schreiben Sie eine Datenbankfunktion, welche einen Passagier auf einem Flug cancelt. Zu diesem Zweck deklarieren Sie einige Variablen,
  233. -- welche z.B. den Familien- und den Vornamen halten, sowie die Flugnummer. Löschen Sie tatsächlich den Passagier aus der Passagierliste
  234. -- heraus und geben Sie als Rückgabewert der Funktion die Stornierungskosten aus. Diese berechnen sich nach folgender
  235. -- Formel: Gebühr = Flugdauer (in Stunden) * 50 Sollte es zu Fehlermeldungen kommen, überlegen Sie, ob man
  236. -- (ohne explizites Exception Handling) etwas dagegen machen kann.
  237.  
  238.  
  239. --NOTE: nachfolgende funktion funktioniert nur wenn es keine fk constraints in richtung child (gepäck) gibt.
  240. --das ist zB. der fall wenn ich einen eigenen datensatz nur in passagierliste einfüg. also zuerst:
  241. insert into passagierliste values (16,5, '1XXX'); -- <--WICHTIG die Funktion funktioniert nur wenn dieses insert zuerst ausgeführt wird!!!!!!
  242. --...reinkopieren und ausführen. jetzt gibts einen datensatz der auf die person maier herbert und den flug AB4741 verweist und zusätzlich sitzt der junge
  243. -- auf sitzplatz 1XXX zum rumtesten und selber datensätze kreieren muss man eine personid und eine flugid finden die schon existieren ABER beide zusammen
  244. --in der passagierliste nicht vorkommen. nützliche select statements dazu sind:
  245. select flugid, personid, dauer, vorname, nachname, flugnummer, sitzplatznummer from passagierliste join person using (personid) join flug using(flugid);
  246. select * from passagierliste join person using (personid);
  247. select * from passagierliste ;
  248. --und um diesen direkt wieder rauszulöschen logischerweise
  249. delete from passagierliste where personID = 5 AND FlugID = 16;
  250. --jedoch machen wir das rauslöschen sowieso in der funktion unten!
  251.  
  252.  
  253. CREATE or REPLACE
  254. FUNCTION funcCancelPassagier
  255. RETURN NUMBER
  256. IS
  257. v_flugnr flug.flugnummer%type :='AB4741'; --wenn ich den datensatz oben anlege dann sind das die 3 werte nach denen ich suchen muss
  258. v_nachname person.nachname%type:='Maier';
  259. v_vorname person.vorname%type:='Herbert';
  260.  
  261. v_personID person.personID%type;
  262. v_flugID flug.flugID%type;
  263. v_gebuehr number;
  264. v_flugdauer flug.dauer%type;
  265. v_fehler BOOLEAN := false; --wenn nie ein fehler passiert bleibt diese variable immer false und gibt erlaubt am ende das delete statement und eine berechnung des rückgabe werts,.. sollte irgendwo ein fehler auftreten dann wird die variable auf true gesetzt und das delete garnicht ausgeführ und als rückgabe wert nur -1 angegeben
  266. v_errCount int; --die variable verwend ich ein paar mal, hauptsächlich um abzuzählen, wieviele einträge ein select statement ausgeben würd,... in den meisten fällen (aufgrund dieser select statements) is der wert entweder 0 oder 1
  267. BEGIN
  268. select count(personID) into v_errCount from person where nachname = v_nachname and vorname = v_vorname;
  269. if v_errCount = 1 then
  270. select personID into v_personID from person where nachname = v_nachname and vorname = v_vorname; --dieses statement ohne if würd auch schon funktionieren sofern denn der name vorhanden is. wenn nicht crashed das programm daher die if rundherum. ich mach das bei allen folgenden select statements auch
  271. else
  272. v_fehler := true; --oO vermutlich gibts entweder den vornamen oder den nachnamen nicht oder alles is im arsch dann kommt er hier rein,.. und die bool variable is nun true,.. kein zurück mehr,.. das ergebnis wird jetzt -1 sein :'(
  273. end if;
  274.  
  275. select count(flugID) into v_errCount from flug where flugnummer = v_flugnr;--wie gerade oben! dieses select statement mit dem count is fast genau das selbe wie 2 zeilen darunter nur das es keine fehler zurückgibt, wenn er nix findet
  276. if v_errCount = 1 then
  277. select flugID into v_flugID from flug where flugnummer = v_flugnr; --specher die flugid in die variable v_flugID
  278. else
  279. v_fehler := true;
  280. end if;
  281.  
  282. select count(dauer) into v_errCount from flug join passagierliste using (flugid) where personid=v_personID and flugid=v_flugID;
  283. if v_errCount = 1 then
  284. select dauer into v_flugdauer from flug join passagierliste using (flugid) where personid = v_personID and flugid = v_flugID; --speicher die dauer in v_flugdauer
  285. else
  286. v_fehler := true;
  287. end if;
  288.  
  289. if(v_fehler = false) then --nur wenn alle 3 select statements von oben auch einen wert in die 3 variablen (v_flugdauer, v_flugID, v_personID) reingeschrieben haben is die bool noch immer auf false und wir können fröhlich und entspannt DELETEn,... ach und wir dürfen auch unsere gebür ausrechnen
  290. delete from passagierliste where personID = v_personID AND FlugID = v_flugID;
  291. v_gebuehr := v_flugdauer * 50; --die ultimative universalformel um stornierungsgebüren zu berechnen!!!
  292. else
  293. v_gebuehr := -1; --alles im arsch,... gib -1 zurück
  294. end if;
  295.  
  296. return v_gebuehr;
  297.  
  298. END;
  299. /
  300.  
  301. begin
  302. DBMS_OUTPUT.PUT_LINE('Stornierungskosten: ' || funcCancelPassagier); --ACHTUNG! die andere möglichkeit eine funktion aufzurufen mit: SELECT functionName from DUAL;
  303. --funktioniert hier nicht!! da diese nur funktioniert, sofern in der funktion selber NUR select statements und
  304. --keine alter,update, delete, select-update anweisungen aufgerufen werden.
  305. end;
  306. /
  307.  
  308. -------------------------------
  309. -------------------------------
  310.  
  311. --Und hier nun die Lösung die auch etwaige foreign key constraints bezüglich gepäck abhandeln sollte.
  312. --Ich hab mir dazu die Sabine aus der datenbank rausgesucht, also ein existierender Eintrag. diese Frau hat auch gepäck aufgegeben.
  313. --Wenn ich versuche würd mit der obigen funktion die sabine zu löschen gibts einen fehler, da sie gepäck hat und daher eine fk constraint -> daher muss ich hier auch ihr gepäck löschen
  314. --wenn ich das ganze ausführe is der datensatz natürlich löscht und weg, genauso wie das gepäck,...
  315. --um den ursprungszustand wieder herzustellen hier die 2 insert statements um sie mit den original daten wieder reinzufügen plus
  316. --die select statements um zu schaun obs den auch geklappt hat:
  317. insert into passagierliste values (1,19, '10B'); --nur ausführen sofern man diesen datensatz schon gelöscht hat!!!
  318. insert into gepaeck values(7,19,1,19.5);
  319.  
  320. select * from passagierliste where personID = 19 AND FlugID = 1;
  321. select * from gepaeck where personID = 19 AND FlugID = 1;
  322.  
  323. --und here we goooo...
  324.  
  325.  
  326. CREATE or REPLACE
  327. FUNCTION funcCancelPassagier
  328. RETURN NUMBER --int würd eigentlich auch schon ausreichen
  329. IS
  330. v_flugnr flug.flugnummer%type :='OS1467'; --diese daten gabs schon in der datebank und es gibt auch einen constraint da gepäck vorhanden
  331. v_nachname person.nachname%type:='Kroll';
  332. v_vorname person.vorname%type:='Sabine';
  333.  
  334. v_personID person.personID%type;
  335. v_flugID flug.flugID%type;
  336. v_gebuehr number;
  337. v_flugdauer flug.dauer%type;
  338. v_fehler BOOLEAN := false;
  339. v_errCount int;
  340. BEGIN
  341. select count(personID) into v_errCount from person where nachname = v_nachname and vorname = v_vorname;
  342. if v_errCount = 1 then
  343. select personID into v_personID from person where nachname = v_nachname and vorname = v_vorname;
  344. else
  345. v_fehler := true;
  346. end if;
  347.  
  348. select count(flugID) into v_errCount from flug where flugnummer = v_flugnr;
  349. if v_errCount = 1 then
  350. select flugID into v_flugID from flug where flugnummer = v_flugnr;
  351. else
  352. v_fehler := true;
  353. end if;
  354.  
  355. select count(dauer) into v_errCount from flug join passagierliste using (flugid) where personid=v_personID and flugid=v_flugID;
  356. if v_errCount = 1 then
  357. select dauer into v_flugdauer from flug join passagierliste using (flugid) where personid = v_personID and flugid = v_flugID;
  358. else
  359. v_fehler := true;
  360. end if;
  361.  
  362. if(v_fehler = false) then
  363. select count(personID) into v_errCount from gepaeck where personID = v_personID AND FlugID = v_flugID; --HIER is der UNTERSCHIED zu oben!!!
  364. if v_errCount > 0 then --sofern bisher kein fehler aufgetreten is soll er checken obs ein gepäck gibt
  365. delete from gepaeck where personID = v_personID AND FlugID = v_flugID; --wenn ja dann sollte dann speichert er mir in die variable v_errCount einen wert (wahrscheinlich 1)
  366. end if; --rein. und in dem fall führt er noch ein delete statement aus, das das gepäck löscht, bevor die liebe Sabine
  367. --aus der passagierliste eleminiert wird. somit funktioniert dann auch das nächste delete statement ohne probleme,.. hoff ich
  368. delete from passagierliste where personID = v_personID AND FlugID = v_flugID;
  369. v_gebuehr := v_flugdauer * 50;
  370. else
  371. v_gebuehr := -1;
  372. end if;
  373.  
  374. return v_gebuehr;
  375.  
  376. END;
  377. /
  378.  
  379. begin
  380. DBMS_OUTPUT.PUT_LINE('Stornierungskosten: ' || funcCancelPassagier || ' GELD'); --kA ob € oder was weis ich! plus hier könnte man noch eine kleine if einbauen, die checkt ob eine -1 rauskommt und in dem fall eine fehlermeldung anstelle der stornierungskosten ausgibt... mag ich aber nicht!
  381. end;
  382. /
  383.  
  384. --thats it! gl hf <3
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement