Übung Informationssysteme 1 rupi ss 2005 nachdem die übungen nicht wirklich kontrolliert werden sind die lösungen hier generell nur eingeschränkt als richtig zu betrachten. manchmal korrigiere ich fehler während der besprechung.. manchmal nicht ;> Inhaltsverzeichnis 1. Datenbanken – Einführung 1.1. Programmsystem Hotelverwaltung . . . . . . . . . . . . . 1.2. Physische Datenabhängigkeit . . . . . . . . . . . . . . . . 1.3. Redundanz und Inkonsistenz . . . . . . . . . . . . . . . . 1.4. 3-Schichten Architektur . . . . . . . . . . . . . . . . . . . 1.5. Physische und logische Datenunabhängigkeit . . . . . . . 1.6. Physische, logische, externe Ebene . . . . . . . . . . . . . 1.7. Datenbanksysteme . . . . . . . . . . . . . . . . . . . . . . 1.8. Begriffe aus dem Bereich Datenmodelle und Datenbanken 1.9. 4 Phasen des Datenbankentwurfs . . . . . . . . . . . . . . 1.10. konzeptuelle Modellbildung und logisches Design . . . . . . . . . . . . . . . 2 2 3 4 4 4 4 5 5 6 6 2. Entity-Relationship-Modell 2.1. ER-Diagramm: Produktionsunternehmen . . . . . . . . . . . . . . . . . . 2.2. ER Diagramm: Autoverleih . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3. ER Diagramm: Stundenaufzeichnung . . . . . . . . . . . . . . . . . . . . . 7 7 8 9 3. Das 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. 3.8. 3.9. Relationale Datenmodell Begriffe . . . . . . . . . . . . . . . . . . . . . . . . . Relationale Algebra: Universitätsdatenbank . . . . . Relationale Algebra: Selektion, Projektion, Verbund Operationen auf Relationen . . . . . . . . . . . . . . Relationale Algebra: Beispiel Warengruppe . . . . . Operationen auf Relationen: Ableitung . . . . . . . . Schlüssel . . . . . . . . . . . . . . . . . . . . . . . . . funktionale Abhängigkeiten . . . . . . . . . . . . . . Anomalien im Relationenschema von 3.8 . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 9 9 10 10 11 11 11 12 3.10. Hülle von funktionalen Abhängigkeiten und kanonische Überdeckung 3.11. Methoden zur Überprüfung der Äqivalenz von Schemata . . . . . . . 3.12. Anwendung dieser Methoden . . . . . . . . . . . . . . . . . . . . . . 3.13. Armstrongaxiome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.14. funktionale Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . . . 3.15. Überführung von ER-Diagramm in Relationales Modell . . . . . . . 3.16. Äquivalente Abhängikeitsmengen . . . . . . . . . . . . . . . . . . . . 3.17. funktionale Abhängigkeiten und kanonische Überdeckung . . . . . . 3.18. Bestimmung von Normalformen . . . . . . . . . . . . . . . . . . . . . 3.19. Schlüsselkandidaten und Normalformen . . . . . . . . . . . . . . . . 3.20. Verlustlose Zerlegung in 3NF . . . . . . . . . . . . . . . . . . . . . . 3.21. Relation Zoo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.22. ER Diagramm zu Relationenschema . . . . . . . . . . . . . . . . . . 3.23. Verlustlose Zerlegung in BCNF . . . . . . . . . . . . . . . . . . . . . 3.24. Zerlegung in 4NF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.25. Qualitätskriterien für 4NF und mehrwertige Abhängigkeiten . . . . . 4. Abfragesprachen für Relationale Datenbanken, SQL 4.1. Liste aller Repräsentationsräume . . . . . . . . . 4.2. Liste aller Praktika . . . . . . . . . . . . . . . . . 4.3. LVA LeiterInnen des FAW . . . . . . . . . . . . . 4.4. Belegungsplan . . . . . . . . . . . . . . . . . . . . 4.5. Informatikabteilungen . . . . . . . . . . . . . . . 4.6. LVAs ohne Raum . . . . . . . . . . . . . . . . . . 4.7. Terminplan von Wagner Roland . . . . . . . . . . 4.8. freie Räume . . . . . . . . . . . . . . . . . . . . . 4.9. Vergleich der Informatik-Institute . . . . . . . . . 4.10. die letzten Informatik LVAs . . . . . . . . . . . . 4.11. LVA-Summen View . . . . . . . . . . . . . . . . . 4.12. LVA mit den wenigsten Terminen . . . . . . . . . 4.13. Abhaltungs Prozente . . . . . . . . . . . . . . . . 4.14. Raumauslastung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 12 12 12 13 13 13 13 13 13 14 15 15 15 16 . . . . . . . . . . . . . . 16 16 17 17 18 18 19 19 19 20 20 21 22 23 24 A. Verwendete Datenbank 26 B. Einspielen der Daten 27 1. Datenbanken – Einführung 1.1. Programmsystem Hotelverwaltung Die Daten werden als xml Files mit utf8 Encoding in einer unten beschriebenen Directory Struktur abgelegt. Das Documentroot des Baumes ist in einem Configfile (ebenfalls 2 xml) abgelegt dass von den Anwendungsprogrammen über einen Suchpfad (/etc, /usr/local/etc, . ) gefunden wird. Parsing und Verifizierung der xml Datein erfolgt über xml-Schemata die ebenfalls über einen konfigurierbaren Pfad erreichbar sind. Falls die Programme nicht über einen zentralen Server und Terminals betrieben wird muss darauf geachtet werden dass der Fileserver für das Documentroot korrekte Writelocks verwaltet. Auf die Daten wird mit einem wie folgt konstruiertem Pfad zugegriffen: $documentroot/$entitytype/$id.xml Datenstruktur Folgende Entitytypen werden realisiert: gast enthält den Namen und eine Referenz auf das Ausweisdokument dass hinterlegt wurde (als id wird Name.Ausweisnummer verwendet, falls noch kein Ausweis vorliegt (zb. telefonische Reservierung) wird dem Namen eine laufende Nummer zugewiesen, das Dokument wird ggf. umbenannt) zimmer mit beschreibung. (als id wird die Zimmernummer verwendet). belegung enthält die id’s der Gäste. (als id wird Zimmernummer.checkin.checkout verwendet, das Datum wird als YYYYMMDD codiert und 00000000 für den checkout verwendet falls der Gast noch anwesend ist). reservierung enthält die id des Gastes der reserviert hat. (id analog zur belegung) goods enthält den Namen und den Preis des jeweiligen Konsumgutes. (id ist eine laufende Nummer) konsumtion Enthält eine Liste der goods id’s die Konsumiert wurden und einen Flag der anzeigt ob schon bezahlt wurde (id ist gastid.YYYYMMDD.nummer) Benutzung Rezeption muss die entsprechenden Gast, Belegungs und Reservierungsdaten eingeben, Reservierungen können über ein Kalenderinterface getätigt werden. Bei Checkout wird eine Liste der offenen Konsumtionen angezeigt, diese kann für Gäste ausgedruckt werden. Bedienung legt die Konsumtionsdaten an und kann ggf. den bezahlt Flag setzen falls gleich bezahlt wurde. 1.2. Physische Datenabhängigkeit Ein Programm greift auf Daten (Preisliste) mit folgender Charaktaristik zu: • sie sind in dem File /home/herbert/foobar gespeichert • die ersten 8 byte einer Zeile werden als Float gelesen 3 • der Rest der Zeile als Produktbeschreibung (String, koi8 codiert) Sowohl Speicherort als auch die Struktur sind fix codiert, somit liegt physische Datenabhängigkeit vor. 1.3. Redundanz und Inkonsistenz Redundanz bezeichnet die mehrfache Speicherung der selben Information. Inkonsistenz ist ein Widerspruch in den vorliegenden Informationen wenn eine Kopie einen unterschiedlichen Informationsstand aufweist. Beispiel Die Preisliste eines Ladens wird auf der Webseite des selben als HTML Tabelle veröffentlicht und intern über eine Tabellenkalkulation verwaltet. Damit sind die selben Daten redundant gespeichert, wenn die Liste in der Tabellenkalkulation geändert wird und nicht auf der Webseite liegt eine Inkonsistenz vor. 1.4. 3-Schichten Architektur Externes Schema (Sicht) Teilmengen der Gesamtinformation oder von der Gesamtinformation abgeletite Daten werden auf den jeweiligen Anwendungsbereich zugeschnitten dargestellt. Konzeptionelles Schema (logische Ebene) In einem sog. Datenbankschema wird festgelegt welche Daten abgespeichert sind. Internes Schema (physische Ebene) Auf dieser Ebene wird festgelegt wo die Daten gespeichert sind (Festplatte. . . ). 1.5. Physische und logische Datenunabhängigkeit logische Datenunabhängigkeit Anwendungen sprechen Daten mit ihrer logischen Bezeichnung (zb. Name) an. Eine Änderung auf dieser Ebene kann über Sichten vor der Anwendung versteckt werden. Sichten realisieren somit logische Datenunabhängigkeit. physische Datenunabhängigkeit Modifikation der physischen Speicherstruktur belässt die logische Ebene invariant. Beispiel ist das Anlegen eines DB Index. Die Trennung von logischer und physischer Ebene realisiert somit physische Datenunabhängigkeit. 1.6. Physische, logische, externe Ebene physische Ebene Autorenkarten haben den Karteikartentyp B und liegen alphabetisch sortiert in Laden die zu 2/3 aufgefüllt sind. Auf den Laden stehen die Buchstaben. Belege über den Ankauf liegen in Ordnern im Archivraum sequenziell geordnet. 4 logische Ebene Die Karten enthalten spezielle Informationen (siehe Angabe). Buchhaltungsbelege enthalten einen Zusammenhang zur Inventarnummer des Buchs. externe Ebene Die Buchhaltung hat Zugriff auf die Ankaufsbelege, BesucherInnen auf die Freihandbibliothek, nicht aber auf das Archiv. 1.7. Datenbanksysteme charakteristische Eigenschaften • physische und logische Datenunabhängigkeit • sicherstellen von Datenintegrität und Vermeidung von Redundanz • flexible Abfragemöglichkeit • korrekter MehrbenuzerInnenzugriff • Datensicherheit geeignete Anwendungen • grosse Datenmengen • mehrere BenutzerInnen ungeeignete Anwendungen • kleine Datenmengen • zeitkritische Anwendungen 1.8. Begriffe aus dem Bereich Datenmodelle und Datenbanken Datenmodell umfasst die Konzepte die die Struktur einer Datenbank beschreiben wie Datentypen und Beziehungen. Das Datenmodell enthält noch keine konkreten Einzelheiten der Abspeicherung. Akademisch genau ist ein Datenmodell der ”Werkzeugkasten” zur Beschreibung der DAtentypen und ihrer Beziehungen. D.h. das ER-Modell ist ein Datenmodell. Datenbankschema legt die Struktur der der abgespeicherten Daten(objekte) fest. Das Schema enthält die Daten über die abgespeicherten Daten. Datenbank Management System sind die Programme zum Zugriff auf die Datenbasis, die Konsistenzprüfung usw. Datenbasis sind mit einander in Beziehung stehende Daten die zur Erfüllung einer bestimmten Aufgabe notwendig sind. Datenbanksystem ist die Gesamtheit aus Datenbasis und Datenbank Management System. 5 1.9. 4 Phasen des Datenbankentwurfs Anforderungsanalyse Die Informationsanforderungen und Datenverarbeitungsvorgänge der zu modellierenden Welt werden gemeinsam mit den zukünftigen AnwenderInnen analysiert und ein Pflichtenheft für das zukünftige System erstellt. Konzeptueller Entwurf Die Informationsstruktur wird auf anwedungsorientierter Ebene festgelegt und eine Informationsstrukturbeschreibung (z.B. in Form eines ER-Schemas) erstellt. Implementationsentwurf Physischer Entwurf 1.10. konzeptuelle Modellbildung und logisches Design In der konzeptuellen Modellbildung wird ein anwendungsorientiertes Modell der Daten (Informationsstrukturbeschreibung) erstellt. Dabei wird z.B. das ER-Modell verwendet um ein abstraktes Modell der Daten zu erstellen, dass im logischen Design in ein logisches Datenbankschema übergeführt wird (meist relationales Modell). Hier wird im Unterschied zum konzeptuellen Entwurf schon auf das einzusetzende DBMS eingegangen. 6 2. Entity-Relationship-Modell 2.1. ER-Diagramm: Produktionsunternehmen 7 2.2. ER Diagramm: Autoverleih 8 2.3. ER Diagramm: Stundenaufzeichnung 3. Das Relationale Datenmodell 3.1. Begriffe Relationenschema ist die Menge der Attribute und ihrer Domains einer Relation und ihre Schlüsselattribute. Relation Teilmenge R ⊆ D0 × D1 × . . . × Dn der Domains (Di ). Eine Tabelle”. ” Zusammengesetztes Attribut Attribute die aus mehreren anderen Attributen zusammengesetzt/gebildet werden. Schlüsselattribut Attribut dass ein Tupel einer Relation eindeutig bestimmt. Domain bezeichnet den Wertebereich den ein Attribut haben kann. Diese müssen atomar sein. 3.2. Relationale Algebra: Universitätsdatenbank 1. σSWS=3 (Vorlesungen) 2. πName (Studenten) 3. πName (σFachgebiet=Sprachtheorie (Assistenten)) 4. πVorlNr (Vorlesungen) − πVorlNr (Hören) 5. πAssistenten.Name, Professoren.Name (σBoss=P rof essoren.P ersN r (Assistenten × Professoren)) 3.3. Relationale Algebra: Selektion, Projektion, Verbund A a2 a2 R1 = σC=c3 (R) B C D E b1 c3 d3 e2 b1 c3 d2 e2 R2 C c1 c1 c3 c3 c2 c1 = πCDE (R) D E d1 e1 d3 e2 d3 e2 d2 e2 d1 e1 d2 e2 Hier in R2 taucht ein Tupel doppelt auf und muss eliminiert werden. 9 R3 A a1 a1 a2 a2 a1 a3 a1 C c1 c1 c1 c1 c1 c3 c3 c3 c3 c3 c2 c2 c1 c1 c1 c1 c1 = πABD (R) B D b1 d1 b1 d3 b1 d3 b1 d2 b2 d1 b3 d2 b3 d3 R2 o n R3 E D A e1 d1 a1 e1 d1 a1 e2 d3 a1 e2 d3 a2 e2 d3 a1 e2 d3 a1 e2 d3 a2 e2 d3 a1 e2 d2 a2 e2 d2 a3 e1 d1 a1 e1 d1 a1 e2 d2 a2 e2 d2 a3 e2 d3 a1 e2 d3 a2 e2 d3 a1 B b1 b2 b1 b1 b3 b1 b1 b3 b1 b3 b1 b2 b1 b3 b1 b1 b3 Auffallend ist hier: beim Join R2 o n R3 entstehen mehr Tupel als in R waren, das Attribut D ist nicht eindeutig. 3.4. Operationen auf Relationen 3.5. Relationale Algebra: Beispiel Warengruppe Alle Artikel der Warengruppe Laptop: πARTIKELNR (σWGNR=πWGNR (σWARENGRUPPE = Laptop (WARENGRUPPE)) ARTIKEL) Join ist meist effizienter: πArtikelNr (σWARENGRUPPE=Laptop (WARENGRUPPE o n ARTIKEL) 10 3.6. Operationen auf Relationen: Ableitung R ∩ S = R − (R − S) Mengendurchschn Ro nθ S = σθ (R × S) Theta Join Ro nR.Ai =S.Bi S = σR.Ai =S.Bi (R × S) Equi Join R | × S = πsch(R) (σR.Ai =S.Ai ∧R.Bi =S.Bi ... (R × S)) (linker) Semi Join = πSch(R) (R o n S) mit gegegenem J R ] × S = σR.Ai =S.Ai ∧R.Bi =S.Bi ... (R × S)∪ ((R × {[−, −, · · · , −]}) − ({[−, −, · · · , −]} × S)) linker äusserer Jo = (R o n S) ∪ ((R − (R | × S)) × {[−, −, · · · , −]}) R × [S = S] × R rechter äusserer Join R ] × [ S = (R] × S) ∪ (R × [S) äusserer Join 3.7. Schlüssel • Jeder Primärschlüssel ist ein Superschlüssel: JA • Jeder Superschlüssel ist ein Kandidatenschlüssel: NEIN • Jeder Kandidatenschlüssel ist ein Superschlüssel: JA • Jeder Kandidatenschlüssel ist ein Primärschlüssel: NEIN • Die Vereinigung aller Kandidatenschlüssel ergibt die Attributmenge: NEIN • Es gibt Relationsenschemata ohne Kandidatenschlüssel: NEIN • Ein Relationenschema mit mindestens einer nicht-trivialen funktionalen Abhängigkeit hat mindestens 2 Superschlüssel: JA • Heit eine Attributmenge n Elemente, so gibt es maximal 2n und minimal 2 Superschlüssel: NEIN (minimal 1, maximal 2n − 1 3.8. funktionale Abhängigkeiten {LVA Nr, Semester} →{LVA Titel} {Matr Nr} →{S Vorname, S Nachname, S GebDat} {Prüfer Nr} →{Prüfer Name} {Matr Nr, LVA Nr, Semester, P Termin, Prüfer Nr} →Note ein Schlüsselkandidat wäre dh. {LVA Nr, Matr Nr, Prüfer Nr, Semester, P Termin} 11 3.9. Anomalien im Relationenschema von 3.8 Insert Eine PrüferIn die keine StudentIn geprüft hat für eine kann nicht (sauber) eingefügt werden. Update kann bei Änderung von zb. PrüferInnennummer auftreten. Delete Das Löschen eines Prüfers würde auch alle StudentInnendaten löschen. 3.10. Hülle von funktionalen Abhängigkeiten und kanonische Überdeckung Hülle von funktionalen Abhängigkeiten F + ist die aus einer gegebenen Menge von funktionalen Abhängigkeiten F herleitbare Menge F + von funktionalen Abhängigkeiten kanonische Überdeckung FC ist quasi eine minimale Variante einer Menge von funktionalen Abhängigkeiten F in der weder überflüssige Attribute vorhanden sind noch eine ’linke Seite’ mehrfach vorkommt. 3.11. Methoden zur Überprüfung der Äqivalenz von Schemata 3.12. Anwendung dieser Methoden 3.13. Armstrongaxiome unvollständig TransitivitätAB → EGH AB → C ∧ B → D ⇒ AB → CD AB → CD ∧ CD → EGH ⇒ AB → EGH G → A ∧ AB → C ⇒ BG → C 3.14. funktionale Abhängigkeiten sehr unvollständig. . . Aufnahme Aufnz. → Aufn.Dat/Zeit, P.Name, P.Adr., SozNr. SozNr. → P.Name, P.Adr. Befunde BefID → AufnZ, Bef Dat/Zeit, BefTyp, Bef.Text 12 3.15. Überführung von ER-Diagramm in Relationales Modell Zeitung Redakteur Artikel Schlagwort Art-Schlagw schreibt : : : : : : { [ Z-Name:String; Z-Adresse:String ] } {[R-Kurzzeichen:String; R-Name:String; Z-Name:String ] } {[ A-Datum:float; A-Titel:String ]} {[S-Nr:Integer; S-Wort:String]} {[ S-Nr:Integer; A-DAtum:float; A-Titel:String ] } {[ R-Kurzzeichen:String; A-Datum: float; A-Titel:String ] } 3.16. Äquivalente Abhängikeitsmengen 3.17. funktionale Abhängigkeiten und kanonische Überdeckung • Prod ({ Pr, Ma, M },{ Pr → M, Pr → Ma, M → Ma } ) • kandidatenschlüssel: Pr • verletzung 3NF: M → Ma 3.18. Bestimmung von Normalformen • RS1 ({F, D, P, G}, {F, D → P, G},{F → G} kandidatenschlüssel: FD verletzung der 2NF: F → G • RS2 ({F,D,P,N},{FD → PN, P → N, N → P } ) kandidatenschlüssel: FD verletzung der 3NF: P → N, N → P 3.19. Schlüsselkandidaten und Normalformen 3.20. Verlustlose Zerlegung in 3NF RS1 • kanonische überdeckung: D → B, D → C, D → F, BC → C, D → F ⇒ D → BCF • kandidatenschlüssel: ADE • 2. NF verletzt wegen D → B • 3. NF zerlegung: RS11({B,C,D,F},{D → BCF}) RS12({ADE},{}) RS2 • kanonische überdeckung: C → A, E → F, B → D • kandidatenschlüssel: BCE • 2. NF verletzt wegen: C → A 13 • zerlegung in 3NF: RS21({A,C},{C → A }) RS22({E,F},{E → F }) RS23({B,D},{B → D }) RS24({BCE},{}) RS3 • kanonische überdeckung: AC → BDEF • kandidatenschlüssel: AC • das ist in BCNF (auf der linken seite der k.ü. steht nur der kandidatenschlüssel) RS4 • kanonische überdeckung: E → AF, B → C • kandidatenschlüssel: BDE • 2. NF verletzt: B → C • zerlegung in 3NF: RS41({A,E,F},{E → AF } ) RS42({B,E,F},{B → C } ) RS43({B,D,E},{} ) RS5 • kanonische überdeckung: AB → D, DE → ABCF • kandidatenschlüssel: ABE, DE (non key: C,F) • BCNF verletzt wegen AB → D schummler für normalformen BCNF X → A ⇒ X ist superkey 3NF X → A ∧ A ist non key ⇒ X is superkey 2NF jedes non-key attribut ist voll funktional abhängig von jedem kandidatenschlüssel 3.21. Relation Zoo • Funktionale Abhängigkeiten: Art TierNr → Box Box → Art TierNr Art → Behausung Behausung → Bereich Wärter Bereich → Leiter • Kandidatenschlüssel: Box, Art TierNr • Art → Behausung (zb.) widerspricht der 2NF, die Relation ist dh. in 1NF 14 • Folgende Abhängikeiten sind redundant in dieser Relation: Art → Behausung Behausung → Bereich Wärter Bereich → Leiter Die Entsprechenden Informationen sind mehrfach abgespeichert und können zu Updateanomalien führen. Einfügeanomalien treten auf wenn ein neuer Bereich ohne Behausungen, eine Behausung ohne Wärter oder Tiere eingefügt werden soll. Löschanomalien treten analog dazu auf (zb. alle Bären sterben und alle Informationen über den Bereich Ost, Käfig, Sam und Smith sind futsch). • Zerlegung in 3NF: Box:({Box, Art, TierNr},{Box → Art TierNr}) Art:({Art, Behausung},{}) Behausung:({Behausung,Bereich,Wärter},{Behausung → Bereich, Wärter }) Bereich:({Bereich,Leiter},{}) 3.22. ER Diagramm zu Relationenschema 3.23. Verlustlose Zerlegung in BCNF • RS1:({A,B,C,D,E}, {BD → ACE, BC → ADE}) ist in BCNF • RS2:({A,B,C,D,E}, {BC → E, AC → BD, B → D }) RS21:({B,D},{B → D }) RS22:({A,B,C,D},{AC → BD }) RS23:({B,C,E},{BC → E}) 3.24. Zerlegung in 4NF • mvds: FahrerNr →→ BusNr FahrerNr →→ Linie BusNr →→ Line Linie →→ HaltestellenId Linie →→ BusNr Start-Datum Start-Uhrzeit FahrerNr Start-Datum Start-Uhrzeit → BusNr Linie • KS: Fahrer BusNr Start-Datum Start-Uhrzeit Linie • zerlegung in 4NF: Linenplan:({Linie, HatestellenId},{Linie →→ HaltestellenId}) Fahrten:({Fahrer, BusNr, Start-Datum, Start-Uhrzeit, Linie},{ FahrerNr StartDatum Start-Uhrzeit → BusNr Linie } ) 15 3.25. Qualitätskriterien für 4NF und mehrwertige Abhängigkeiten Eine Relation R ist dann in 4NF wenn jede MVD α →→ β eine der folgenden Bedingungen erfüllt: • die MVD α →→ β ist trivial (β ⊆ α oder β = R − α) • α ist ein Superkey von R Eine MVD (multivalued dependency oder tupelgenerierte Abhängigkeit) α →→ β ist dann gebeben wenn ein bestimmtes α eine bestimmte, endliche Menge (n ∈ N) von β Werten zugeordnet ist. Das Qualitätskriterium der 4NF ist nun dass solche MVDs α →→ β nur dann zulässig sind wenn α Superkey ist oder die MVD trivial ist. 4. Abfragesprachen für Relationale Datenbanken, SQL Die Tabellen für diese Übung wurden anhand der Angabe erstellt, siehe dazu auch das SQL Listing 1 im Anhang. Beim Einspielen der Daten (siehe auch Perl Listing 2) traten allerdings bei folgenden Statements Fehler auf: INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO Abhaltung Abhaltung Abhaltung Abhaltung Abhaltung Abhaltung Abhaltung Abhaltung Abhaltung Abhaltung Abhaltung Abhaltung Abhaltung Abhaltung VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (’330211’,’3993’,’08.03.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’15.03.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’22.03.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’29.03.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’19.04.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’26.04.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’03.05.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’10.05.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’17.05.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’24.05.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’31.05.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’14.06.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’21.06.96’,’8’,’30’,’10’,’0’,’VE (’330211’,’3993’,’28.06.96’,’8’,’30’,’10’,’0’,’VE Ursache dieser Fehler sind mehrfach auftretende Tupel. 4.1. Liste aller Repräsentationsräume SELECT ∗ from Raum where Name l i k e ’ Rep%’ ; raum id M 103A ... name Rep.-R A anzpers 130 16 gebaeude Mensagebaeude 005’); 005’); 005’); 005’); 005’); 005’); 005’); 005’); 005’); 005’); 005’); 005’); 005’); 005’); ... M 103B Rep.-R M 103C Rep.-R M 202D Rep.-R M 202E Rep.-R M 202H Rep.-R M 202F Rep.-R M 202G Rep.-R 8 Reihen gesamt B C D E H F G 50 130 45 45 45 1 120 Mensagebaeude Mensagebaeude Mensagebaeude Mensagebaeude Mensagebaeude Mensagebaeude Mensagebaeude 4.2. Liste aller Praktika SELECT LVANr, Name , Std from LVA where Std > 10 and Typ = ’PR ’ ; lvanr name 317103 Anleitung zu wissenschaftlichen Arbeiten 317095 Praktikum Chem. Technologie Anorgan. Stoffe II 316417 Wissenschaftliche Arbeiten für Dipl. u. Diss. 316142 Analytisch-Chemisches Praktikum IV 316440 Anorganisch chemisches Praktikum II für WITECH 316441 Anorganisch chemisches Praktikum II f.Techn.Chemie 6 Reihen gesamt std 20 12 20 12 12 12 4.3. LVA LeiterInnen des FAW SELECT DISTINCT Abhaltung . Persnr , Person . Name from Person , Abhaltung where LVANr l i k e ’ 3127% ’ AND Abhaltung . PersNr = Person . PersNr ORDER BY Person . Name ASC; persnr 2461 1259 472 786 2176 1321 1686 7 Reihen name Gierlinger Christian Küng Josef Marik Vladimir Schmollmüller Walter Tjoa A Min Wagner Roland Wöß Wolfram gesamt 17 4.4. Belegungsplan SELECT Tag , v o n s t u n d e as von , von minute as m, b i s s t u n d e as b i s , b i s m i n u t e as m1, a b h a l t u n g . l v a n r , LVA. Name as LVA Name , Person . Name as L e i t e r I n FROM Raum, Abhaltung , lva , Person WHERE Raum . Name = ’HS 13 ’ AND Abhaltung . Raum Id = Raum . Raum ID AND Abhaltung . Tag = ’ 0 9 . 0 5 . 1 9 9 6 ’ AND Abhaltung . LVANr = LVA. LVANr AND Person . PersNr = Abhaltung . PersNr ORDER BY von stunde , von minute ASC; tag 1996-05-09 1996-05-09 1996-05-09 1996-05-09 1996-05-09 1996-05-09 von 8 10 10 11 11 12 m 30 0 15 0 15 0 bis 10 10 11 11 12 13 m1 0 15 0 15 0 30 lvanr 312240 311152 311152 311153 311153 315320 1996-05-09 12 0 13 30 315320 1996-05-09 1996-05-09 13 17 45 0 15 19 15 0 312705 102035 lva name Programmiersprachen Übung Statistik 1 Übung Statistik 1 Übung Statistik 1 Übung Statistik 1 Überblick Symbolic Computation Überblick Symbolic Computation Übung Informationssysteme 1 Österreichisches und Europäisches Kartellrecht leiterin Rechenberg Peter Pölz Werner Pölz Werner Pölz Werner Pölz Werner Winkler Franz Buchberger Bruno Wöß Wolfram Keinert Heinz 9 Reihen gesamt 4.5. Informatikabteilungen SELECT substring (LVANr from 1 f o r 4 ) as AbteilungsNr , Count(LVANr ) as Anzahl , sum( Std ) as Stunden from LVA WHERE LVANr l i k e ’ 311% ’ OR LVANr l i k e ’ 312% ’ OR LVANr l i k e ’ 321% ’ GROUP BY A b t e i l u n g s N r HAVING Count(LVANr) < 10 ORDER BY Stunden DESC; abteilungsnr anzahl 3116 9 3111 8 3125 5 3 Reihen gesamt 18 stunden 20 14 9 4.6. LVAs ohne Raum SELECT DISTINCT Abhaltung . LVANr, LVA. Name from Abhaltung ,LVA where Abhaltung . LVANr l i k e ’ 3127% ’ AND LVA. LVANr = Abhaltung . LVANr AND Abhaltung . Raum Id = ’ ’ ; lvanr name 0 Reihen gesamt 4.7. Terminplan von Wagner Roland SELECT tag , v o n s t u n d e as von h , von minute as von m , b i s s t u n d e as b i s h , b i s m i n u t e as bis m , r . name , l . l v a n r , l . name FROM a b h a l t u n g a , l v a l , raum r , p e r s o n p WHERE t a g between ’ 01−06−1996 ’ AND ’ 30−06−1996 ’ and p . name l i k e ’ Wagner Roland%’ and a . l v a n r = l . l v a n r and a . raum id = r . raum id and a . p e r s n r = p . p e r s n r order by tag , von stunde , von minute ; tag von h 1996-06-04 13 1996-06-11 13 1996-06-18 13 1996-06-21 9 1996-06-25 13 1996-06-28 9 6 Reihen gesamt von m 30 30 30 0 30 0 bis h 15 15 15 13 15 13 bis m 15 15 15 0 15 0 name HS 10 HS 10 HS 10 T 811 HS 10 T 811 lvanr 312704 312704 312704 312714 312704 312714 name Informationssysteme 1 Informationssysteme 1 Informationssysteme 1 Diplomandenseminar 2 Informationssysteme 1 Diplomandenseminar 2 4.8. freie Räume SELECT raum id , name FROM raum WHERE gebaeude l i k e ’ Kepl%’ and raum id != a l l ( SELECT raum id from a b h a l t u n g WHERE t a g= ’ 15−05−1996 ’ AND ( ( v o n s t u n d e ∗60+ von minute < 12∗60 AND b i s s t u n d e ∗60+ b i s m i n u t e > 1 2 ∗ 6 0 ) OR ( v o n s t u n d e ∗60+ von minute >= 12∗60 AND v o n s t u n d e ∗60+ von minute < 12∗60+90) ) ) ; raum id K 009D ... 19 name K 009D ... KH 007 KH 008 K 153C K 167D Gang A Gang D K 121B K 166D K 171D K 207A K 236C K 266D K 267D K 001A 15 Reihen KEP 2 KEP 3 K 153C K 167D Gang A Gang D K 121B K 166D K 171D K 207A K 236C K 266D K 267D K 001A gesamt 4.9. Vergleich der Informatik-Institute SELECT substring (LVANr, 1 , 3 ) as InstNr , sum( Std ) as Std FROM l v a WHERE LVANr l i k e ’ 311% ’ OR LVANr l i k e ’ 312% ’ OR LVANr l i k e ’ 321% ’ GROUP BY I n s t N r ORDER BY sum( Std ) DESC; instnr std 312 316 311 162 321 40 3 Reihen gesamt 4.10. die letzten Informatik LVAs SELECT a . tag , a . LVANr, l . name , v o n s t u n d e | | ’ : ’ | | von minute as von , b i s s t u n d e | | ’ : ’ | | b i s m i n u t e as b i s FROM Abhaltung a , l v a l WHERE l . l v a n r = a . l v a n r 20 AND ( l . l v a n r l i k e ’ 311% ’ OR l . LVANr l i k e ’ 312% ’ OR l . LVANr l i k e ’ 321% ’ ) AND a . Tag between ’ 2 9 . 4 . 9 6 ’ AND ’ 4 . 5 . 9 6 ’ AND ( v o n s t u n d e ∗60+ von minute ) = ( SELECT max( v o n s t u n d e ∗60+ von minute ) FROM a b h a l t u n g WHERE ( l v a n r l i k e ’ 311% ’ OR LVANr l i k e ’ 312% ’ OR LVANr l i k e ’ 321% ’ ) AND a . t a g = t a g ) ORDER BY a . t a g ; tag lvanr 1996-04-29 321155 1996-04-30 312937 1996-04-30 312937 1996-05-01 312935 1996-05-02 312284 1996-05-02 312301 1996-05-03 312913 1996-05-04 311128 8 Reihen gesamt name von bis Übungen zu Didaktik der Informatik Praktikum aus praktischer Informatik Praktikum aus praktischer Informatik Oberon 2 Praktische Informatik II Objektorientierte Informationssysteme Betriebssysteme 2 Technologiefolgenabschätzung 18:0 19:30 19:30 17:30 18:0 18:0 19:0 10:0 18:45 21:0 21:0 18:0 19:30 21:15 20:30 15:0 4.11. LVA-Summen View Bei dieser Aufgabe gab es leichte Probleme mit den Mehrfacheinträgen: Dieser View sollte eigentlich mehrfache Abhaltungen durch mehrere Personen eliminieren. Das ist aber nicht wirklich einfach, die vorliegende Variante eliminiert nur gleichzeitige Abhaltungen von mehreren Personen, verschobene Abhaltung durch mehrere Personen und mehrere Gruppen mit einer LVA-LeiterIn werden nicht erfasst. CREATE VIEW lvasummen AS SELECT l . l v a n r , l . name , l . typ , l . std , count ( ∗ ) as anzahl , round (sum( b i s s t u n d e ∗60 + b i s m i n u t e − v o n s t u n d e ∗60 − von minute ) / 60 , 2) as stunden FROM l v a l , ( SELECT DISTINCT l v a n r , tag , von stunde , von minute , bis stunde , bis minute FROM a b h a l t u n g ) a WHERE l . l v a n r = a . l v a n r 21 GROUP BY l . l v a n r , l . name , l . typ , l . s t d ; Beispiel zu oben beschriebenen Phänomen: SELECT ∗ FROM lvasummen order by a n z a h l desc l i m i t 2 0 ; lvanr name 700145 Mathematik II und III 241126 VO-VII: Rechtliche Aspekte im Marketing 315156 Mathematik für Informatiker II Übungen 316305 Organisch-Chemisches Praktikum I 316310 Organisch-Chemisches Praktikum III 316340 Organisch-Chemisches Praktikum I 317105 Privatissimum Chemische Technologie Anorg.Stoffe 315062 Mathematik I für SOWI 311456 Übung Nachrichtentechnik 2 für Informatiker 313201 VO Theoretische Physik II (Elektrodynamik) 314303 Halbleiterbauelemente 312521 Übungen zu Operations Research II 312531 Übung Modellbildung und Simulation 318105 Privatissimum Organische Technologie 315101 Analysis II 137017 Klausurenkurs Verfassungsrecht 241117 Exportlehrgang 2. Abschnitt 312518 PR zu Objektorientiertes Programmieren 315604 Mathematik II für Mechatroniker 241119 Exportlehrgang 2. Abschnitt 20 Reihen gesamt typ VO VO UE PR PR PR PV UE UE VO VO UE UE PV VO RE SE PR VO SE std 4 2 2 7 10 8 4 1 1 4 4 1 1 5 5 4 10 3 5 10 anzahl 75 70 70 70 70 70 70 68 65 63 59 58 56 56 55 54 54 50 46 45 4.12. LVA mit den wenigsten Terminen SELECT l v a n r , name , a n z a h l from lvasummen WHERE ( l v a n r l i k e ’ 311% ’ or l v a n r l i k e ’ 312% ’ or l v a n r l i k e ’ 321% ’ ) AND a n z a h l = ( SELECT min( a n z a h l ) FROM lvasummen WHERE l v a n r l i k e ’ 311% ’ or l v a n r l i k e ’ 312% ’ or l v a n r l i k e ’ 321% ’ ); 22 stunden 245.50 264.50 111.50 280.00 560.00 280.00 70.00 52.50 68.00 97.25 93.00 43.50 42.00 56.00 72.00 88.00 232.75 81.25 59.25 175.50 lvanr name 312164 Diplomandenseminar 2 312314 Projektpraktikum 2 Reihen gesamt anzahl 1 1 4.13. Abhaltungs Prozente SELECT l . l v a n r , l . name , l . typ , l . std , l . s t d ∗ 14 as s o l l s t d , count ( ∗ ) ∗ s t d as i s t s t d , round ( ( count ( ∗ ) ∗ s t d ) / ( s t d ∗ 1 4 ) ∗ 1 0 0 , 2 ) as p r o z e n t FROM l v a l , ( s e l e c t d i s t i n c t l v a n r , t a g from a b h a l t u n g ) a WHERE l . l v a n r = a . l v a n r AND l . l v a n r l i k e ’ 3127% ’ GROUP BY l . l v a n r , l . name , l . std , l . typ UNION SELECT l v a n r , name , typ , std , s t d ∗ 14 as s o l l s t d , ’ 0 ’ as i s t s t d , ’ 0 ’ as p r o z e n t FROM l v a WHERE l v a n r l i k e ’ 3127% ’ AND l v a n r not in ( s e l e c t l v a n r from a b h a l t u n g ) ; lvanr 312703 312704 312705 312706 312707 312708 312712 312713 312714 312718 ... name Privatissimum Wissensbasierte Systeme Informationssysteme 1 Übung Informationssysteme 1 Praktikum aus Informationssysteme Dissertantenseminar 4 Ausgewählte Kapitel aus Informationssysteme Projektpraktikum Informationssysteme Seminar Informationssysteme Diplomandenseminar 2 Datenmodellierung 23 typ PV VO UE PR SE VO PR SE SE VO std 2 2 2 5 3 1 10 2 3 1 soll std 28 28 28 70 42 14 140 28 42 14 ist std 0 28 26 10 0 2 0 4 21 14 prozent 0 100.00 92.86 14.29 0 14.29 0 14.29 50.00 100.00 ... 312719 Übung Datenmodellierung 312720 Programmierpraktikum 3: Smalltalk 312725 Praktikum aus Informationssysteme 312727 Projektpraktikum Informationssysteme 312728 Diplomandenseminar 3 312729 Seminar Informationssysteme 312730 Dissertantenseminar 1 17 Reihen gesamt UE PR PR PR SE SE SE 2 2 5 10 3 2 3 28 28 70 140 42 28 42 26 18 0 20 0 8 0 4.14. Raumauslastung Es scheint nicht schlüssig zu sein in Bezug auf die Raumauslastung den View aus 4.11 zu verwenden, da für diese Aufgabenstellung mehrfache Abhaltung gezählt werden sollte. CREATE VIEW i n f a u s l a s t u n g AS SELECT r . raum id , r . name , sum( ( b i s s t u n d e ∗60+ b i s m i n u t e − v o n s t u n d e ∗60 − von minute ) / 6 0 ) as infstunden FROM raum r , abhaltung a WHERE a . raum id = r . raum id AND ( l v a n r l i k e ’ 311% ’ OR l v a n r l i k e ’ 312% ’ OR l v a n r l i k e ’ 321% ’ ) GROUP BY r . raum id , r . name ; CREATE VIEW a u s l a s t u n g AS SELECT r . raum id , r . name , sum( ( b i s s t u n d e ∗60+ b i s m i n u t e − v o n s t u n d e ∗60 − von minute ) / 6 0 ) as gesamt FROM raum r , abhaltung a WHERE a . raum id = r . raum id GROUP BY r . raum id , r . name ; SELECT a . raum id , a . name , round ( a . gesamt , 2 ) as gesamt , round ( i . i n f s t u n d e n , 2 ) as i n f o r m a t i k , round ( i . i n f s t u n d e n / a . gesamt ∗ 1 0 0 , 2 ) as p r o z e n t 24 92.86 64.29 0 14.29 0 28.57 0 FROM a u s l a s t u n g a , infauslastung i WHERE i . raum id = a . raum id ; raum id J 311B KG 318 K 223B KH 004 K 034D KHG I T 112 HT 182E SR 101 HT 172H T 008 MZ 003B T 1010 KHG II T 911 K 033C HT 175G MZ 412A K 153C HG 001 MZ 001A K 112A T 111 MZ 009A T 211 K 041B K 08 K 04 K 009D K 012D T 857 KG 712 P 004 HT 179F MZ 005B K 12 T 811 ... name J 311B KG 318 K 223B KEP 1 K 034D KHG I T 112 HS 2 SR 101 HS 7 HS 14 MZ 003B T 1010 KHG II T 911 K 033C HS 5 MZ 412A K 153C HS 9 HS 15 K 112A T 111 HS 16 T 211 HS 1 ESH 2 ESH 3 K 009D K 012D T 857 KG 712 P 004 HS 4 MZ 005B ESH 1 T 811 gesamt 713.75 587.50 470.25 435.75 818.25 221.00 759.75 661.50 330.50 834.50 800.50 1368.00 1006.25 170.25 824.75 715.25 789.00 1048.50 784.50 707.50 821.50 723.75 1370.50 925.50 1045.50 490.50 323.75 217.00 775.25 790.00 534.25 688.50 1209.75 910.25 645.75 262.50 968.25 25 informatik 37.75 37.00 3.00 16.50 49.50 138.50 99.50 100.25 192.00 56.00 284.00 5.00 174.25 8.00 152.25 113.00 9.00 3.75 86.25 77.50 36.75 8.00 58.50 46.00 87.75 47.50 79.50 32.50 128.50 96.00 195.75 99.00 96.00 117.00 3.00 15.50 478.75 prozent 5.29 6.30 0.64 3.79 6.05 62.67 13.10 15.15 58.09 6.71 35.48 0.37 17.32 4.70 18.46 15.80 1.14 0.36 10.99 10.95 4.47 1.11 4.27 4.97 8.39 9.68 24.56 14.98 16.58 12.15 36.64 14.38 7.94 12.85 0.46 5.90 49.44 ... HG 101 HS 10 K 224B K 224B MZ 001B HS 17 KH 008 KEP 3 T 212 T 212 HT 177F K 177F MZ 005A MZ 005A K 269D K 269D T 007 HS 13 K 001A K 001A HT 174H HS 6 T 005 HS 11 T 711 T 711 LEKT-ZIM LEKT-ZIM K 123A K 123A MZ 407A MZ 407A P 013 HS 8 VE 005 VE 005 P 215 P 215 T 006 HS 12 HT 180E HS 3 58 Reihen gesamt 733.75 772.00 800.50 436.75 1119.75 605.50 834.25 734.75 660.00 440.75 850.75 728.75 1308.00 252.00 652.00 633.75 727.25 196.50 733.00 704.25 893.00 258.50 39.00 41.25 25.00 391.75 124.00 3.00 25.50 142.25 52.00 150.75 167.50 204.25 6.00 82.50 21.50 50.00 9.75 5.00 222.50 185.00 35.23 5.05 5.15 5.72 34.99 20.48 0.36 3.47 21.55 11.80 17.72 22.98 15.62 2.38 12.65 3.39 6.88 4.96 0.68 31.59 20.72 A. Verwendete Datenbank Für die Übung wird eine PostgreSQL DBMS Version 7.4.7 verwendet, die Tabellen wurden wie folgt erstellt: /∗ i n f o s y s 1 − uebung ∗ database create statements ∗ t a b l e d e f i n i t i o n s l i k e s t a t e d i n Infosys1 UE SQL1 . p d f ∗ ∗ ruprechtsberger , sose05 ∗ ∗ n o t e s : o r a c l e s p e c i f i s c h e d a t e n t y p e n wurden mit ∗ entsprechenden p o s t g r e s q l analoga ver t a us ch t ∗ w a r s c h e i n l i c h n i c h t immer o p t i m a l . . ∗ v a r c h a r 2 => v a r c h a r ∗ number => numeric ∗/ −− l v a t a b l e DROP TABLE LVA; 26 CREATE TABLE LVA ( LVANr varchar ( 6 ) PRIMARY KEY, −− 312704 Name varchar ( 7 0 ) , −− 50 i s not enough f o r used values Std numeric ( 2 ) , Typ char ( 2 ) −− VO, UE, SE , . . . ); −− p e r s o n t a b l e DROP TABLE Person ; CREATE TABLE Person ( PersNR varchar ( 4 ) PRIMARY KEY, −− Personal −Nummer Name varchar ( 5 0 ) −− Name ); −− a b h a l t u n g t a b l e DROP TABLE Abhaltung ; CREATE TABLE Abhaltung ( LVANr varchar ( 6 ) , PersNr varchar ( 4 ) , Tag date , −− Kalender−Tag Von Stunde numeric ( 2 ) , Von Minute numeric ( 2 ) , B i s S t u n d e numeric ( 2 ) , Bis Minute numeric ( 2 ) , Raum Id varchar ( 8 ) , PRIMARY KEY(LVANr, PersNr , Tag , Von Stunde , Von Minute , Bis Stunde , Bis minute , Raum Id ) ); −− raum t a b l e DROP TABLE Raum ; CREATE TABLE Raum ( Raum Id varchar ( 8 ) , Name varchar ( 3 0 ) , AnzPers numeric ( 4 ) , Gebaeude varchar ( 2 0 ) , PRIMARY KEY( Raum Id ) ); −− Raum−Nummer −− Raumbezeichnung Listing 1: createtables.sql B. Einspielen der Daten Die zur Verfügung gestellten Daten wurden mit folgendem Script in die Datenbank eingespielt: #! / u s r / b i n / p e r l −w 27 # # # # # i n f o s y s 1 uebung s o s e 05 ruprechtsberger populate t a b l e s with given values not t h a t e f f i c i e n t , b u t p r e t t y f a i l s a v e use s t r i c t ; use Pg ; use open ’ : e n c o d i n g ( i s o −8859−1) ’ ; # db c o n n e c t i o n h a n d l e ( o t h e r c o n n e c t i o n parameter h a n d l e d v i a environment ) my $con = Pg : : connectdb ( ”dbname=i n f o s y s 1 ”) ; die ” c o n n e c t i o n e r r o r o c c u r e d \n ” i f ( $con−>s t a t u s != Pg : : PGRES CONNECTION OK) ; # tables my @ t a b l e s = ( ”Person ” , ”Raum” , ”Lva ” , ”Abhaltung ” ) ; foreach my $ t a b l e ( @ t a b l e s ) { # empty t a b l e my $ r e s = $con−>exec ( ”DELETE from $ t a b l e ”) ; die ( ” d e l e t e from $ t a b l e f a i l e d ”) i f ( $ r e s −>r e s u l t S t a t u s != Pg : : PGRES COMMAND OK ) ; # open f i l e open ( FILE , ” $ t a b l e . l s t ”) | | die ( ”can ’ t open $ t a b l e . l s t ”) ; while (<FILE>) { s /\ s ∗ $ / / ; # g e t r i d o f t a i l i n g w h i t e s p a c e s ( i n c l . CR) s / ’ /\\ ’ / g ; # e s c a p e ’ c h a r a c t e r s my @values = s p l i t ( / ; / ) ; # generate i n s e r t statement my $ i n s e r t = ”INSERT INTO $ t a b l e VALUES ( ” ; f or (my $ i = 0 ; $ i < @values ; $ i ++) { $ i n s e r t .= ” ’ $ v a l u e s [ $ i ] ’ ” ; $ i n s e r t .= ” , ” i f ( $ i != $#values ) ; } $ i n s e r t .= ”) ” ; $ r e s = $con−>exec ( ” $ i n s e r t ”) ; print STDERR ( ” i n s e r t s t a t e m e n t : $ i n s e r t f a i l e d ! \ n ”) i f ( $ r e s −>r e s u l t S t a t u s == Pg : : PGRES FATAL ERROR ) ; } c l o s e FILE ; 28 } Listing 2: populate tables.pl 29