Sie sind auf Seite 1von 264

Informationssysteme ● 1-264

0
`
Informationssysteme

Informationssysteme

Skriptum zur Vorlesung - 01.10.2019

Dipl.-Ing. Paul Panhofer BSc.1∗

1 ZID, TU Wien, Taubstummengasse 11, 1040, Wien, Austria

Abstract: Ein Informationssystem ist ein soziotechnisches System, das die Abarbeitung von Informationsnachfrage zur
Aufgabe hat. Es handelt sich um ein Mensch/Aufgabe/Technik-System, das Daten produziert, beschafft, ver-
teilt und verarbeitet.

Daneben bezeichnen Informationssysteme im allgemeineren Sinne Systeme von Informationen, die in einem
wechselseitigen Zusammenhang stehen.

Die Begriffe Informationssystem und Anwendungssystem werden häufig synonym verwendet. Dabei werden
Informationssysteme im engeren Sinne als computergestützte Anwendungssysteme verstanden. Es ist jedoch
wichtig zu verstehen, dass ein Anwendungssystem mit Anwendungssoftware und Datenbank nur Teil eines
Informationssystems sind.
MSC: paul.panhofer@gmail.com
Keywords:

Contents 1.2.1. Bestandteile des ER Modells 12


1.2.2. Datenaggregation 13
1. Daten - Datenmodellierung 10 1.2.3. Entität 14
1.1. Phasen der Datenbankentwicklung 10 1.2.4. Schlüsselattribute 14
1.1.1. Phasen der 1.2.5. Vererbung 14
Datenbankentwicklung 10 1.2.6. Kardinalität 14
1.1.2. Externe Phase - 1.3. Relationale Modell 15
Informationsbeschaffung 11 1.3.1. Relationale Modell 15
1.1.3. Konzeptionelle Phase - 1.3.2. Transformieren des ER Modells 15
Semantische Modell 11 1.3.3. n:m Relation 17
1.1.4. Logische Phase - Logische 1.3.4. Vererbung 17
Datenmodell 12 1.3.6. Namenskonventionen 18
1.1.5. Physische Phase - 1.3.5. Fallbeispiel: Transformieren
Datenbankschema 12 eines ER Modells auf ein
Relationales Modell 20
1.2. Entity Relationship Modell 12
2. SQL - Data Query Lanuguage 22

E-mail: paul.panhofer@tuwien.ac.at 2.1. SQL Grundlagen 22

1
Informationssysteme

2.1.1. SQL - Structured Query 4. SQL - Zeilenfunktionen 40


Language 22 4.1. Zeilenfunktionen - Grundlagen 40
2.1.2. Kategorien von SQL Befehlen 22 4.1.1. Funktionstypen 40
2.1.3. DQL - Select Anweisung 23 4.1.2. Zeilenfunktionen 40
2.2. Select Klausel - Projektion 24 4.1.3. Kategorien von
2.2.1. Select Klausel 24 Zeilenfunktionen 41
2.2.2. Wiederholte Spaltenausgabe 25 4.2. Datumsfunktionen 41
2.2.3. Spaltenwerte bearbeiten 25 4.2.1. Datumstypen vs. Zeichenketten 41
2.2.4. Spaltenwerte verknüpfen 25 4.2.2. Erzeugen eines Datums 42
2.2.5. Spaltenalias 25 4.2.3. Konstrukturfunktionen 42
2.2.6. Pseudospalten 26 4.2.4. Konvertieren von Datumswerten
2.2.7. Pseudospalten: nextval, currval 26 - to_date 42
2.2.8. Pseudospalte: rownum 26 4.2.5. Datumsliterale 42
2.2.9. Pseudospalten: user, uid 27 4.2.6. Datumswerte umwandeln -
2.2.10. Pseudospalten: sysdate, to_char() 43
timestamp 27 4.2.7. Rundungsfunktionen - trunc(),
2.3. Case Klausel - Kondition 28 round() 43
2.3.1. Case Klausel 28 4.2.8. Erzeugen von Intervallen 44
2.3.2. Case Klauseln in select 4.2.9. Geschachtelte Intervalle 45
Abfragen 28 4.2.10. Datumsarithmetik 45
2.4. Where Klausel - Restriktion 29 4.2.11. Datumsfunktion:
2.4.1. Restriktion 29 add_months() 46
2.4.2. Abfrageobjekt 29 4.2.12. Datumsfunktion: next_day() 46
2.4.3. Logische Operatoren - and, or, 4.2.13. Datumsfunktion: extract() 46
not, xor 29 4.2.14. Datumsfunktion: last_day() 46
2.4.4. Logischer Operator - like 30 4.2.15. Datumsfunktion: next_day() 47
2.4.5. Logischer Operator - in 30 4.2.16. Datumsfunktion:
2.4.6. Logischer Operator - is 30 months_between() 47
2.4.7. Logischer Operator - between 30 4.3. Textfunktionen 48
2.4.8. Dreiwertige Logik 31 4.3.1. Textfunktion: instr() 48
2.5. Order by Klausel - Sortierung 32 4.3.2. Textfunktionen: trim() 48
2.5.1. Order By Klausel 32 4.3.3. Textfunktion: length() 49
2.5.2. Sortierreihenfolge - asc/desc 32 4.3.4. Textfunktion: soundex() 49
2.5.3. Optionen - nulls first und nulls 4.3.5. Textfunktionen: lower(),
last 32 upper() 50
2.6. Fetch Klausel - Limitierung 33 4.3.6. Textfunktion: replace() 50
2.6.1. Fetch Klausel 33 4.3.7. Textfunktion: substr() 50
2.7. Offset Klausel - Paginierung 33 4.4. Numerische Funktionen 51
2.7.1. Offset Klausel 33 4.4.1. Rundungsfunktionen 51
4.4.2. Konvertierungsfunktionen 52
3. SQL - Datenaggregation 34 4.4.3. Numerische Funktion: abs() 52
3.1. Datenmodellierung 34 4.4.4. Numerische Funktion: exp(),
3.1.1. Relationale Modellierung 34 log() 53
3.1.2. Datenaggregation 34 4.4.5. Numerische Funktion: mod() 53
3.2. From Klausel 35
3.2.1. Grundlagen 35 5. SQL - Aggregatfunktionen 54
3.3. Relationale Join 35 5.1. Aggregatfunktionen 54
3.3.1. Virtuelle Tabellen 35 5.1.1. Aggregatfunktionen 54
3.3.2. Jointyp: Inner Join 36 5.1.2. Median 55
3.3.3. Jointyp: Cross Join 36 5.1.3. Standardabweichung 55
3.3.4. Jointyp: Full Outer Join 37 5.1.4. Aggregatfunktionen und NULL
3.3.5. Jointyp: Natural Join 37 Werte 55
3.3.6. Jointyp: Left-/Right Join 37 5.1.5. UNIQUE Operator 55

2
© Dipl.Ing.-Paul Panhofer Bsc.

5.2. Group by Klausel 56 7.4. Index 73


5.2.1. Neustrukturierung von Daten 56 7.4.1. Datenbankartefakt: Index 73
5.2.2. Group by Klausel 56 7.4.2. Indextyp: B* Index 74
5.2.3. Map Phase 56 7.4.3. Indextyp: Funktionsindex 74
5.2.4. Group by Klausel 57 7.4.4. Indextyp: Unique Index 75
5.2.5. Semantik der Gruppenbildung 58 7.4.5. Indextyp: Volltextindex 75
5.2.6. Fallbeispiel: Gruppierung 58 7.5. Constraints 76
5.2.7. Aggregate Phase 58 7.5.1. Datenkonsistenz und Integrität 76
5.2.8. Having Klausel 58 7.5.2. Datenbankconstraints 76
5.2.9. Null Aggregat 59 7.5.3. Definieren von
Datenbankconstraints 77
6. SQL - Komplexe Abfragen 60 7.5.4. Constraintmonitoring 77
6.1. Unterabfragen 60 7.5.5. Check Constraint 78
6.1.1. Unterabfragen 60 7.6. Sequenz 78
6.1.2. Arten von Unterabfragen 61 7.6.1. Anlegen von Sequenzen 78
6.1.3. Subqueryform: Innere View 61 7.6.2. Sequenzen verwenden 79
6.1.4. Subqueryform: Skalare
Abfragen 62 8. SQL - Data Manipulation Language 80
6.1.5. Subqueryform: Konditionale 8.1. DML - Befehlssatz 80
Abfrage 62 8.1.1. DML Befehlssatz 80
6.2. With Klausel 63 8.2. insert Befehl 81
6.2.1. WITH Klausel - Strukturierung 63 8.2.1. insert Befehl 81
6.2.2. Syntax: WITH Klausel 63 8.2.2. insert - select 81
6.3. Paarweise Vergleich 64 8.3. update Befehl 82
6.3.1. Paarweise Vergleich 64 8.3.1. update syntax 82
6.4. Mengenoperationen 64
6.4.1. Union Klausel - 9. SQL - Data Control Language 84
Vereinigungsmenge 64 9.1. DCL Befehle 84
6.4.2. Intersect Klausel - 9.1.1. DCL Befehlssatz 84
Durchschnittsmenge 65 9.2. create user Befehl 84
6.4.3. Except Klausel - 9.2.1. Benutzerverwaltung 84
Differenzmenge 65 9.2.2. create User Befehl 85
6.5. Quantoren 66 9.3. grant Befehl 85
9.3.1. Privilegien zuordnen 85
7. SQL - Data Definition Language 68 9.3.2. Syntax: grant Befehl 85
7.1. Datenbankartefakte 68 9.3.3. grant Befehl 86
7.1.1. Datenbankartefakte 68
7.2. Tabelle 69 10. PL/SQL - Grundlagen 88
7.2.1. Datenbankartefakt: Tabelle 69 10.1. PL/SQL Grundlagen 88
7.2.2. Spaltendefinition 69 10.1.1. Informationssysteme 88
7.2.3. Schlüsseldefinition 70 10.1.2. PL/SQL 89
7.2.4. DDL Befehl: create table 70 10.1.3. Einsatzgebiete von PL/SQL 89
7.2.5. Fallbeispiel: create table 70 10.1.4. PL/SQL Engine 90
7.2.6. DDL Befehl: drop table 70 10.1.5. Fallbeispiel: PL/SQL
7.2.7. DDL Befehl: truncate table 71 Programm 91
7.2.8. DDL Befehl: alter table 71 10.2. PL/SQL Block 92
7.2.9. Fallbeispiel: alter table 71 10.2.1. Grundgerüst: PL/SQL Block 92
7.3. View 72 10.2.2. Schachtelung von Blöcken 93
7.3.1. Datenbankartefakt: View 72 10.2.3. Arten von Blöcken in PL/SQL 93
7.3.2. Einsatz von Views 72
7.3.3. DDL Befehl: create view 72 11. PL/SQL - Datentypen 94
7.3.4. Variable Bedingungen 73 11.1. Variablen in PL/SQL 94
7.3.5. DDL Befehl: drop view 73 11.1.1. Definition von Variablen 94

3
Informationssysteme

11.1.2. Gültigkeitsbereich von 12.6.4. Autonome Transaktionen 115


Variablen 95 12.6.5. DCL: commit und rollback 115
11.1.3. Qualifier 95 12.6.6. Änderungen zurücknehmen 116
11.1.4. Arten von Datentypen 96 12.6.7. DCL: Savepoints definieren 116
11.2. Skalare Datentypen 96
11.2.1. Numerische Datentypen 96 13. PL/SQL - Blöcke 118
11.2.2. Alphanumerische Datentypen 97 13.1. Blocktyp - Stored Prozedur 118
11.3. Data Dictionary 99 13.1.1. Grundlagen - Stored
11.3.1. Data Dictionary 99 Prozedures 118
11.4. Strukturierte Datentypen 99 13.1.2. Prozedur mit Parametern 119
11.4.1. Record - Strukturierter 13.1.3. Formen der
Datentypen 99 Paramaterübergabe 119
11.5. Virtuelle Tabllen 100 13.1.4. Optionale Parameterübergabe 120
11.5.1. Virtuelle Tabellen 100 13.1.5. Funktionen 120
11.5.2. Records in Virtuellen Tabellen 100 13.2. Blocktyp - Package 121
11.5.3. Arbeiten mit virtuellen 13.2.1. Verwendung von Packages 121
Tabellen 101 13.2.2. Package Spezifikation 121
11.5.4. DQL: Virtuelle Tabellen 101 13.2.3. Package Körper 122
13.3. Trigger 123
12. PL/SQL - Befehle 102
12.1. SQL Befehle in PLSQL 102 13.3.1. Auslösen von Triggern 123
12.1.1. DQL - Data Query Language 102 13.3.2. Anlegen von Triggern 123
12.1.2. DML - Data Manipulation 13.3.3. DML Event definieren 124
Language 103 13.3.4. Pseudorecords 124
12.1.3. forall Anweisung 103 13.3.5. Arten von Triggern 125
12.1.4. DDL - Data Definition 13.3.6. Konditionaler Aufruf von
Language 104 Triggern 125
12.2. Kontrollstrukturen 105
12.2.1. IF THEN Block 105 14. PL/SQL - SQL Funktionen 126
12.2.2. Kontrollstruktur - Case Block 106 14.1. Regeln der Erweiterung 126
12.3. Schleifenkonstrukte 106 14.1.1. Regeln der Erweiterung 126
12.3.1. Loop Block 106 14.1.2. Funktionen für SQL 126
12.3.2. WHILE Block 107 14.1.3. Idempotent 127
12.3.3. FOR Block 107 14.1.4. Optimizer Hints 127
12.4. Fehlerbehandlung 108 14.1.5. Fallbeispiel: Berechnung der
12.4.1. Fallbeispiel: Fehlerfall 108 Fakultät 127
12.4.2. Fehlerbehandlung Grundlagen 108
12.4.3. Fehlerbehandlungsobjekt 108 15. NoSQL - Prinzipien 130
12.4.4. Klassen von Exceptions 109 15.1. Bigdata 130
12.4.5. Benutzerdefinierte 15.1.1. Grundlagen 130
Fehlerobjekte 109 15.1.2. Herausforderungen im Bigdata 131
12.4.6. Exception Handler 111 15.1.3. Technologien im Bigdata
12.4.7. Fehlerbehandlung für forall 111 Umfeld 131
12.5. Kursor 112 15.2. Verteilte Datenbanken 132
12.5.1. Kursor Grundlagen 112 15.2.1. Grenzen konventioneller
12.5.2. Verwaltung der Context Area 112 Datenbanken 132
12.5.3. Verwendung von Kursorn 112 15.2.2. Verteilte Datenbank 132
12.5.4. Cursorattribute 113 15.3. NoSQL Datenbanken 133
12.5.5. Bulk Fetch 113 15.3.1. NoSQL Grundlagen 133
12.6. Transaktionen 114 15.3.2. RDB vs. NoSQL 133
12.6.1. Fallbeispiel: Geldüberweisung 114
12.6.2. Anweisung vs. Transaktionen 114 16. NoSQL - CAP Theorem 134
12.6.3. Implizite Transaktionen 114 16.1. CAP Theorem 134

4
© Dipl.Ing.-Paul Panhofer Bsc.

16.1.1. Eigenschaften von 19.2.1. Datencontainer implizit


Datenbanken 134 anlegen 151
16.1.2. Kategorien von 19.2.2. Collections explizit anlegen 151
Informationssystemen 135 19.3. Collections und Dokumente 152
16.1.3. Achsenausprägungen 135 19.3.1. BSON Datenformat 152
16.2. CA Systeme 136 19.3.2. Eingebettete Objekte 153
16.2.1. Theoretische Grundlagen 136 19.4. Dokumentschema 154
16.2.2. Beispiele für CA Systeme 136 19.4.1. BSON Schema 154
16.3. AP Systeme 137 19.4.2. Schemaattribute 154
16.3.1. Theoretische Grundlagen 137 19.5. Schemaelemente 156
16.3.2. Beispiele für AP Systeme 137 19.5.1. Schemaelement: Eingebettete
16.4. CP Systeme 137 Objekte 156
16.4.1. Theoretische Grundlagen 137 19.5.2. Schemaelement: Enum 156
16.4.2. Beispiele für CP Systeme 137 19.5.3. Schemaelment: Array 157
19.5.4. Arrays von Objekten 157
17. NoSQL - Technologien 138 19.5.5. Collection mit
17.1. Konsistenzmodelle 138 Schemavalidation 158
17.1.1. Arten von Konsistenzmodellen 138 19.6. Views erstellen 158
17.2. Transaktionskonzepte 139 19.6.1. Views 158
17.2.1. ACID Transaktionskonzept 139 19.7. Datencontainer verwalten 159
17.2.2. Sperren 139 19.7.1. Container verwalten 159
17.2.3. BASE Transaktionskonzept 140
20. MongoDB - DQL 160
17.2.4. Optimistic Locking 140
20.1. Daten lesen 160
17.3. MVCC 140
20.1.1. find Befehl 160
17.3.1. MVCC Verfahren 140
20.2. Kursormethoden 161
17.3.2. Diskussion MVCC 141
20.2.1. Cursormethoden 161
17.4. Consistent Hashing 141
20.2.2. pretty() Methode 161
17.4.1. Motivation 141 20.2.3. sort() Methode 162
17.4.2. Verteilen von Daten 142 20.2.4. limit() Methode 162
17.4.3. Consistent Hashing 142 20.2.5. batchSize(), objsLeftInBatch()
17.5. Map Reduce Algorithmus 142 Methode 162
17.5.1. Algorithmusbeschreibung 142 20.2.6. forEach() Methode 163
17.5.2. Phasenbeschreibung 143 20.2.7. skip() Methode 163
17.5.3. Diskussion MapReduce 143 20.3. Query Kriterien - Abfrageobjekt 164
20.3.1. Abfrageobjekt 164
18. MongoDB - Modellierung 146
20.3.2. Formen von Bedingungen 164
18.1. MongoDB 146 20.3.3. Kurzformen von Abfragen 165
18.1.1. MongoDB Motivation 146 20.3.4. Komplexe Bedingungen 165
18.1.2. Skalierbarkeit von Datenbanken 146 20.3.5. $in Operator 166
18.1.3. Datenformat: JSON 147 20.3.6. $where Operator 166
18.1.4. Codebeispiel: Project 20.4. Arrayabfragen 166
Dokument 147 20.4.1. $size Operator 166
18.2. Modellierungsprinzipien 148 20.4.2. $all Operator 166
18.2.1. Modellierungsprinzipien 148 20.4.3. $elemMatch Operator 167
18.2.2. Hierarchische Datenmodell 148 20.5. Projektion 167
18.2.3. Modellstruktur 149 20.5.1. Projektionsobjekt 167
18.2.4. Schemafreie Modellierung 149
21. MongoDB - DML 168
19. MongoDB - DDL 150 21.1. Daten einfügen - insert 168
19.1. Datenkontainer 150 21.1.1. Nebeneffekte 168
19.1.1. Datenkontainer 150 21.1.2. insertOne(), insertMany()
19.2. Datenkontainer anlegen 151 Befehl 168

5
Informationssysteme

21.2. Daten bearbeiten - update 169 22.7.3. Dokumente gruppieren -


21.2.1. updateOne() Befehl 169 $bucket 192
21.2.2. updateMany Befehl 171 22.8. Expressions 193
21.3. Strukturoperatoren 171 22.9. Kontrollexpressions 193
21.3.1. $set Operator 171 22.9.1. $cond Operator 193
21.3.2. $unset Operator 172 22.9.2. $switch Operator 194
21.3.3. $rename Operator 172 22.9.3. $cmp Operator 194
21.4. Werteoperatoren 173 22.10. Arrayexpressions 195
21.4.1. $mul Operator 173 22.10.1. $arrayElemAt Operator 195
21.4.2. $min Operator 173 22.10.2. $concatArrays Operator 195
21.4.3. $inc Operator 174 22.10.3. $in Operator 196
21.5. Arrayoperatoren 174 22.10.4. $map Operator 196
21.5.1. $addToSet Operator 174 22.10.5. $filter Operator 196
21.5.2. $push Operator 175 22.10.6. $reduce Operator 197
21.5.3. $pull, $pullAll Operator 176 22.11. Aggregatexpressions 198
21.5.4. $pop Operator 176 22.11.1. Fallbeispiel: sales 198
21.6. Daten löschen 177
22.11.2. $addToSet, $push Operator 198
21.6.1. delete Befehl 177
22.11.3. $min, $max Operatoren 199
22. MongoDB - Aggregation von Daten 178 22.11.4. $sum Operator 199
22.1. Methoden und Verfahren 178
23. Daten - Datenverarbeitung 202
22.1.1. Aggregatalgorithmen 178
23.1. Datenverarbeitung 202
22.2. Abfragemethoden 179
23.1.1. Datenverarbeitung - Glossar 202
22.2.1. Abfragemethode: count() 179
23.1.2. Datenverarbeitung 202
22.2.2. Abfragemethode: distinct() 179
23.2. Datenformate 203
22.2.3. Abfragemethode: group() 179
22.3. Aggregatframework 180 23.2.1. Datensätze 203
22.3.1. Aggregationspipeline 180 23.2.2. Datenformate 204
22.3.2. Aggregatframework 181 23.2.3. csv Datenformat 204
22.3.3. Methode: aggregate() 181 23.2.4. xml Datenformat 204
22.3.4. Pipelinestufen 183 23.2.5. Fallbeispiel: xml Dokument 205
22.3.5. Fallbeispiel: Projects 183 23.2.6. json Datenformat 205
22.4. Dokumentstufen 184
24. Datenformat - XML 208
22.4.1. Dokumente filtern - $match 184
22.4.2. Dokumente sortieren - $sort 184 24.1. XML Grundlagen 208
22.4.3. Dokumente entfernen - $skip 184 24.1.1. Einsatzgebiete von XML 208
22.4.4. Arrays auflösen - $unwind 185 24.1.2. Fallbeispiel: XML Dokumente 208
22.4.5. Dokumentenstrom einschränken 24.1.3. Aufbau eines XML Dokuments 209
- $limit 185 24.2. XML Elemente 210
22.4.6. Ergebnis abspeichern - $out 185 24.2.1. Struktur eines XML
22.5. Strukturstufen 186 Dokuments 210
22.5.1. Felder hinzufügen - $addFields 186 24.2.2. Aufbau eines XML Elements 211
22.5.2. Felder projizieren - $project 187 24.2.3. Inhaltstypen von XML
22.5.3. Dokumentwurzel ändern - Elementen 211
$replaceRoot 188 24.3. Attribute in Xml Elementen 212
22.6. Beziehungsstufen 188 24.3.1. Xml Attribute - Grundlagen 212
22.6.1. Joins zwischen Collections 188 24.3.2. Vergleich: Elemente vs.
22.6.2. Collections verbinden - $lookup 188 Attribute 212
22.6.3. Unterabfrage definieren - 24.4. Wohlgeformte XML Dokumente 213
$lookup 190 24.4.1. Wohlgeformete XML
22.7. Aggregatstufen 191 Dokumente 213
22.7.1. Reporting 191 24.4.2. Wurzelelement 213
22.7.2. Dokumente gruppieren - $group 191 24.4.3. Elementtags 213

6
© Dipl.Ing.-Paul Panhofer Bsc.

24.4.4. Überlappung von XML 26.4.1. <xsl:apply-templates>


Elementen 213 Element 232
24.5. XML Namensräume 214 26.4.2. <xsl:template> Element 232
24.5.1. Namenskonflikte 214 26.4.3. <xsl:with-param> Element 233
24.5.2. XML Namensräume 214 26.4.4. xsl:mode Attribut 233
24.5.3. Namensraumdefinition 215 26.5. Prozedurale Verarbeitung 234
24.5.4. Standard Namensraum 215 26.5.1. <xsl:variable> Element 234
24.6. Logische Sicht 216 26.5.2. <xsl:value-of> Element 234
24.6.1. XML Technologien 216 26.5.3. <xsl:if> Element 234
24.6.2. XML Komponentenbaum 216 26.5.4. <xsl:choose> Element 235
24.6.3. Komponentenknoten 217 26.5.5. <xsl:for-each> Element 236
24.6.4. Knotentypen 217 26.5.6. <xsl:sort> Element 236
26.6. Ausgabestream 237
25. Datenformat - XML XPath 218 26.6.1. <xsl:element> Element 237
25.1. XPath - Konzepte 218 26.6.2. <xsl:text> Element 237
25.1.1. XPath Konzepte 218 26.6.3. <xsl:attribute> Element 237
25.2. Pfadausdrücke in Kurzform 219 26.6.4. <xsl:attribute-set> Element 238
25.2.1. Vereinfachte Pfadausdrücke 219 26.6.5. <xsl:copy-of> Element 238
25.2.2. Auswahl von Elementknoten 219 26.6.6. <xsl:output> Element 238
25.2.3. Kontextknoten 220 26.7. Suchanfragen 239
25.2.4. Descendant Pfadoperator 220 26.7.1. Auflösen von
25.2.5. Auswahl von Textknoten 220 Templatekonflikten 239
25.2.6. Auswahl von Attributknoten 220 26.7.2. Default Templates 239
25.3. Lösungsobjekt 221 26.7.3. Roottemplate 239
25.3.1. Lösungsobjekt - Datentypen 221 26.7.4. Stringtemplate 241
25.4. Prädikat 221
25.4.1. Definieren von Prädikaten 221 27. Datenformat - XML Schema 242
25.5. Pfadausdrücke in Standardform 222 27.1. Schema Grundlagen 242
25.5.1. Lokalisierungsstufen 222 27.1.1. Inhaltsmodell 242
25.5.2. Achsenbezeichner 222 27.1.2. Validierung 243
25.5.3. Knotenabfragen 223 27.1.3. XML Schema Regeln 243
25.5.4. Formen von XPath Ausdrücken 224 27.2. Struktur: XML Schemas 243
25.6. XPath Funktionen 224 27.2.1. Fallbeispiel: XML Schema 243
25.6.1. Kategorien von Funktionen 224 27.2.2. Aufbau eines XML Schemas 243
25.6.2. Knotenmengenfunktionen 224 27.2.3. Kategorien von Datentypen 245
25.6.3. String Funktionen 225 27.3. Einfache Datentypen 245
25.6.4. Logische Funktionen 226 27.3.1. Einfache XML Elemente 245
25.7. Fallbeispiel: XPath 227 27.3.2. Benutzerdefinierte Datentypen 246
25.7.1. Datei: browser.xml 227 27.3.3. Derivation by Restriction 246
25.7.2. XPath Ausdrücke 227 27.3.4. Derivation by Union 247
27.4. Komplexe Datentypen 247
26. Datenformat - XML XSLT 228 27.4.1. Elemente mit komplexen
26.1. XSLT Grundlagen 228 Datentypen 247
26.1.1. XSLT Stylesheet 228 27.4.2. Strukturierung von XML
26.1.2. Fallbeispiel: Hello World 229 Elementen 248
26.2. XSLT Transformationsprozess 229 27.4.3. Häufigkeitsindikatoren 249
26.2.1. Transformationsschritte 229 27.4.4. gemischter Inhalt 250
26.3. XSLT Programm 230 27.5. Attribute 250
26.3.1. XSLT Stylesheet 230 27.5.1. Attributedefinitionen - Elemente
26.3.2. Templateregel 230 mit einfachem Inhalt 250
26.3.3. XSLT Suchmuster 230 27.5.2. Attributedefinitionen - Elemente
26.3.4. Template Anweisungen 231 mit komplexem Inhalt 251
26.4. Deklarative Verarbeitung 232 27.6. Sichtbarkeitskonzepte 251

7
Informationssysteme

27.6.1. globale Datentypdeklarationen 251 .

28. Datenformat - JSON 252


28.1. JSON Datenformat 253
28.1.1. JSON Grundlagen 253
28.2. JSON Datentypen 254
28.2.1. JSON Datentypen 254
28.2.2. JSON Grundstrukturen 255
28.2.3. Einfache Datentypen 256

Glossar 259

Index 260

8
Informationssysteme - Theorieskriptum
.

Entwicklung relationaler Daten-


banken
Version 2018.09.01
Informationssysteme

1. Daten - Datenmodellierung 1.1. Phasen der Datenbankentwicklung



Die Entwicklung einer relationalen Datenbank
durchläuft mehrere Phasen.

L | 
1.1.1 Phasen der Datenbankentwicklung

Die Entwicklung einer relationalen Datenbank beginnt


in der Regel mit der Beschreibung der Anforderun-
gen des Kunden und endet mit der Erstellung der phy-
sischen Struktur zur Speicherung der Daten .

01. Phasen der Datenbankentwicklung 10

02. Entity Relationship Modell 12

03. Relationale Modell 15


 Auflistung: Entwicklungsphasen 

L Externe Phase 
Informationsbeschaffung: In der externen
Phase wird die Informationsstruktur des Da-
tenmodells entworfen.

n Konzeptionelle Phase 
Semantische Modell: Ziel des konzeptionellen
Entwurfs ist die formalisierte Beschreibung des
betrachteten Sachverhalts.

 Logische Phase: 
Logische Datenmodell: Ziel ist die Übertra-
gung des semantischen Datenmodells in ein
logisches Datenmodell.

 Physische Phase: 
Datenbankschema: Aus dem logischen Modell
wird die konkrete Datenbank generiert.

10
© Dipl.Ing.-Paul Panhofer Bsc.

1.1.2 Externe Phase - Informationsbeschaffung Das Ergebnis der externen Phase ist eine informelle
Beschreibung des Fachproblems in Form eines Doku-
ments.
In der externen Phase wird die Informationsstruktur
des Datenmodells geplant.
 Erklärung: Vorgangsweise 
Ziel der externen Phase ist die Informationsbe- ‚ Als erstes erfolgt eine Strukturierung der Anforde-
schaffung. Die Anforderungen des Kunden werden rungen in Datensätze.
gesammelt und verarbeitet. ‚ Am Ende dieses Schrittes ist die abzubildende Welt
auf eine Menge von Entitäten abgebildet.

‚ Eine Entität stellt ein identifizierbares Objekt der


Wirklichkeit dar.

‚ Entitäten Fallbeispiel Schule: Person, Schüler, Leh-


rer, Fach usw.

‚ Als nächstes werden die Beziehungen zwischen den


Entiäten formuliert. z.B.: Ein Schüler wird von meh-
reren Lehrern unterrichtet.

 Erklärung: Externe Phase  1.1.3 Konzeptionelle Phase - Semantische Mo-


dell
‚ In der externen Phase erfolgt die Bestandsaufnah-
me der Anforderungen des Kunden. Ziel der konzeptionellen Phase ist es eine graphische
Repräsentation der informellen Beschreibung der An-
‚ Es muss herausgefunden werden, welche Informa-
forderungen zu erstellen.
tionen das Datenbanksystem generieren soll - Out-
put - und welche Informationen dazu bereitgestellt
werden müssen - Input.  Erklärung: Konzeptionelle Phase 

‚ Aber selbst die Einschränkung auf bestimmte Be-


‚ Die Prämisse des konzeptionellen Entwurfs ist es
die Beschreibung des Fachproblems auf das Daten-
reiche der Realität ist meist zu komplex.
bankmodell der Datenbank zu übertragen.
‚ Deshalb ist bei der Beschreibung der Anforderungen
eine Beschränkung auf die wichtigsten bzw. inter-
‚ Das semantische Modell dient zur Veranschauli-
chung des technischen Datenmodells im naiven Kon-
essantesten Objekte der Realität und ihrer Bezie-
text. Das Modell muß sowohl für den Kunden als
hungen, untereinander sinnvoll.
auch für den Datenbankentwickler leicht lesbar sein.

11
Informationssysteme

Das Ergebnis der konzeptionellen Phase ist die Be- 1.2. Entity Relationship Modell 
schreibung des Fachproblems in Form des Entity Re-
lationship Modells.
L Modell 
q
Ein Modell beschreibt ein Abbild der Wirklich-
keit.

Zur Beschreibung des semantischen Modells einer re-


1.1.4 Logische Phase - Logische Datenmodell lationalen Datenbank, wird das Entity Relationship
Modell verwendet.
Ziel der logischen Phase ist es das semantische Mo-
dell auf die logische Struktur der Datenbank abzubil-
den.

Das Ergebnis der logischen Phase ist die Beschrei-


bung des Fachproblems in Form des Relationalen
Modells.

 Erklärung: Logische Phase 


‚ In einer relationalen Datenbank ist der Datenbe-
stand auf ein System von Tabellen aufgeteilt.

‚ Die im semantischen Modell definierten Entitäten


werden auf die Tabellen der Datenbank abgebildet.
1.2.1 Bestandteile des ER Modells
‚ Die logische Phase umfasst dabei 2 Schritte. Im ers-
ten Schritt erfolgt eine Transformation des seman- Mit dem ER Modell wird die grundlegende Entitäten-
tischen Modells in das Datenbankschema. bzw. Beziehungsstruktur des semantischen Modells
beschrieben.
‚ Im zweiten Schritt wird eine Normalisierung des
Datenbankschemas durchgeführt. Das ER Modell bildet die Wirklichkeit als einen
Graphen von Entitäten ab. Jede Entität beschreibt
q einen Aspekt der Wirklichkeit.

1.1.5 Physische Phase - Datenbankschema  Auflistung: Bestandteile des ER Modells 

Am Ende dieser Phase ist die Entwicklung der physi-


 Entität 
schen Datenstruktur abgeschlossen.
Entitäten sind eindeutig unterscheidbare Ob-
 Analyse: Physische Phase  jekte. Instanzen sind konkrete Ausprägungen
einer Entität.
‚ Im physischen Modell wird das logische Modell un-
ter Verwendung einer Datendefinitinssprache in ein z.b.: Die Entität Schüler hat die Instanz
konkretes Datenbankschema übersetzt. Alexander Kauper.
‚ In der physischen Phase werden die notwendigen
Datentypen, Wertebereiche, Relationen und Sichten
festgelegt. ( Beziehung 

‚ Das Ergebnis der physischen Phase ist eine Folge Beziehungen beschreiben Relationen zwi-
von Datenbankbefehlen die zum Anlgegen der phy- schen Entitäten.
sischen Datenstruktur in der Datenbank verwendet
z.B: Ein Schüler (Alexander Kauper) leiht ein
werden.
Buch (Die Leiden des jungen Herwig) aus.
q

12
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 1. Entity Relationship Modell

1.2.2 Datenaggregation
ü Attribute 
Datenaggregation beschreibt den Prozess des Zu-
Attribute beschreiben Eigenschaften von Enti-
sammentragens von Daten aus mehreren Tabellen.
täten oder Beziehungen.

z.B. ein Attribut für die Entität Schüler ist Name.


L | 
¤ Schlüssel   Analyse: Datenaggregation 
Ein Schlüssel identifiziert eine Entität eindeutig. ‚ Wir stellen fest, dass durch die Aufteilung der Da-
ten auf mehreren Entitäten, die Daten wieder unter-
Durch die Katalognr kann jeder Schüler einer schiedlich zusammengestellt werden können.
Klasse eindeutig identifiziert werden.
‚ So könnten wir durch geschickte Kombination der
Daten beispielsweise herausfinden, welche Kunden
längere Zeit nicht mehr bei uns bestellt haben.
 Analyse: Entity Relationship Modell 
‚ Aufteilen von Daten auf mehrere Tabellen hilft Da-
‚ Der Grund für diese Flexibilität liegt darin, dass
wir Information so in einfache Daten zerlegt ha-
tenredundanz in der Datenbank zu vermeiden.
ben, dass jede Entität für sich einen Aspekt der
‚ Nun aber stehen wir vor der Herausforderung, die Gesamtinformation beschreibt. Wir haben den Da-
Daten in einer Abfrage so zusammenzustellen, dass tenbestand sozusagen in seine Bausteine zerlegt.
das ursprüngliche Objekt1 wieder zum Vorschein
kommt.
‚ Jeder Baustein für sich ist mit Daten ausgestattet,
die nun, in einem anderen Kontext, zu gänzlich neuer
q Information kombiniert werden können.

1
Wir möchten beispielsweise wissen welche Prüfungen
ein bestimmter Student abgelegt hat.

13
Informationssysteme

1.2.3 Entität ‚ Fremdschlüssel: Ein Fremdschlüssel verknüpft die


Instanzen von Entitäten miteinander.
Ein Geschäftsobjekt ist ein Ausschnitt aus der rea-
len Welt und wird als Entität bezeichnet

 Erklärung: Entität 
‚ In der Datenmodellierung ist eine Entität ein kon-
kretes Objekt bzw. ein konkreter Sachverhalt.
q
‚ Eine Entität unterscheidet sich über ein Schlüsse-
lattribut von anderen Entitäten desselben Typs.
1.2.5 Vererbung
‚ Der Entitättyp beschreibt die Ausprägung eines Ob-
jekts durch die Angabe von Attributen.
L Vererbung 
q Vererbung definiert eine Beziehung zwischen
Entitäten. Die Beziehung beschreibt dabei ei-
ne ist ein Beziehung.

z.B.: Eine Schüler ist eine Person.

1.2.6 Kardinalität

Die Kardinalität oder auch Konnektivität gibt den


Grad einer Beziehung an. Wir unterscheiden dabei
3 Typen:

 Auflistung: Grade von Beziehungen 


1.2.4 Schlüsselattribute ‚ 1:1 Beziehung: Eine Klasse hat einen Klassen-
vorstand. Ein Lehrer ist Klassenvorstand von
Schlüsselattribute identifizieren Instanzen einer genau einer Klasse.
Entität oder Beziehung.

 Auflistung: Arten von Schlüsselattributen 


‚ Primärschlüssel: Ein Primärschlüssel identifiziert
eine Instanz oder Beziehung eindeutig. Jeder Pri- ‚ 1:n Beziehung: Eine Klasse hat mehrere
märschlüssel ist eindeutig für die Entität auf die er Schüler. Ein Schüler besucht genau eine Klas-
sich bezieht. se.

‚ n:m Beziehung: Eine Klasse wird von mehre-


ren Lehrer unterrichtet. Ein Lehrer unterrichtet
mehrere Klassen.

Der Primärschlüssel der Entität Schüler besteht


aus der Klasse und der Katalognummer.
Ë q

14
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 2. 1:1 Relation

1.3. Relationale Modell  1.3.2 Transformieren des ER Modells

Für die Abbildung des ER Modells in das Relationale


L Relationale Modell  Modell wurde eine Reihe von Transformationsregeln
definiert.
Das relationalle Modell wird zur Darstellung
des logischen Modells in der relationalen Mo-
dellierung verwendet.

Ziel des relationalen Modells ist es das semantische


Modell auf die logische Struktur einer relationalen
Datenbank abzubilden.

1.3.1 Relationale Modell

Das Resultat der logischen Phase des Datenbankent-


wurfs ist das relationale Modell.  Transformation: Entitäten 
‚ Die Entitäten des ER Modells werden auf Tabellen
 Erklärung: relationale Modell  im Relationalen Modell abgebildet.
‚ Während das ER Modell als Gesprächsbasis zwi- ‚ Die Attribute der Entitäten werden zu Feldern in
schen dem Kunden und dem Datenbankentwickler den entsprechenden Tabellen.
herangezogen wird, dient das relationale Modell zur
Dokumentation der Datenstruktur einer relationa-
‚ Für Primärschlüssel werden Primärschlüssel- fel-
der in der Tabelle definiert.
len Datenbank.

‚ Das relationale Modell wird im technischen Um-


‚ Je nach Kardinalität gibt es für Relationen unter-
schiedliche Abbildungsregeln.
feld eingesetzt. Es wird verwendet zur technischen
Dokumentation der Struktur der Daten.

15
Informationssysteme

Abbildung 3. 1:n und n:m Relation

 Transformation: 1:1 Relation   Transformation: 1:n Relation 


‚ Eine 1:1 Relation wird im relationalen Modell mit ‚ Eine 1:n Relation wird im relationalen Modell mit
einem Fremdschlüsselfeld angezeigt. einem Fremdschlüsselfeld angezeigt.

‚ Dabei liegt es in der Entscheidung des DB Admins ‚ Im Gegensatz zur 1:1 Relation muß das Fremd-
in welche der beiden Tabellen das Fremdschlüsselfeld schlüsselfeld in die Tabelle eingetragen werden, die
eingetragen wird. der Many Seite der Relation entspricht.

‚ 1:1 Relationen aus Entity Relaship Modellen werden ‚ Sind mit der 1:n Relation zusätzliche Felder assoziert
mit Fremdschlüsselspalten im Relationalen Mo- so werden sie in derselben Tabelle eingetragen wie
dell aufgelöst. das Fremdschlüsselfeld.

16
© Dipl.Ing.-Paul Panhofer Bsc.

1.3.3 n:m Relation 1.3.4 Vererbung

Die n:m Relation wird verwendet um komplexe


Relationen in einer Datenbanken abzubilden.
L Vererbung 
Vererbung definiert eine Beziehung zwischen En-
titäten. Die Beziehung beschreibt dabei eine
ist ein Beziehung.

z.B.: Eine Schüler ist eine Person.

Vererbung stellt ein zentrales Konzept der Model-


lierung dar.

L | 
 Transformation: n:m Relation   Erklärung: Vererbung 
‚ n:m Relationen werden eingesetzt um komplexe Re- ‚ Die Vererbung dient dazu, aufbauend auf existie-
lationen im relationalen Model abzubilden. renden Entitäten neue Entitäten zu definieren, wo-
z.B.: Eine Klasse wird von mehreren Lehrern unter- bei die Beziehung zwischen ursprünglicher und neuer
richtet. Ein Lehrer unterrichtet mehrere Klassen. Entität dauerhaft ist.

‚ Im Relationalen Modell wird eine n:m Relation in ‚ Wird bezeichnen dabei die Entität von der geerbt
Form von 2 1:n Relationen dargestellt. wird als Basis- bzw. Vaterentität. Die erbende En-
tität wird als Kindentität bezeichnet.
‚ Für die 1:n Relationen wird im Modell eine eigene
Tabelle hinzugefügt. ‚ Die Kindentität stellt dabei eine Erweiterung der
ursprünglichen Entität dar.
‚ Tabellen zum Auflösen von n:m Relationen werden
als Joined Tables bezeichnet. Das relationale Modell unterstützt Vererbung als
Die Joined Table beinhaltet dabei die Fremdschlüs- Konzept nicht.
selfelder beider 1:n Relationen.
 Transformation: Vererbung 
‚ Besitzt die n:m Relation jedweilige Attribute wer-
den diese ebenfalls in die Joined Table als Felder ‚ Bei der Abbildung des ER Modells in das Relationa-
eingetragen. le Modell müssen edwaige Vererbungsbeziehungen
im ER Modell neu modelliert werden.
‚ Für die Namensgebung von Joined Tables hat
es sich bewährt die Namen der Tablellen, getrennt ‚ Zur Auflösung einer Vererbungsbeziehung kommt
durch einen Unterstirch zu verwenden die die Rela- eine der beiden folgenden Strategien zum Einsatz:
tion definieren. Single Table bzw. Joined Table Strategie.

q
 Erklärung: Single Table Strategie 
‚ Instanzen von Entitäten die zueinander in einer Ver-
erbungsbeziehung stehen werden alle in einer ein-
zelnen Tabelle gespeichert.
‚ Die Felder der Tabelle entsprechen den Attributen
aller in Relation stehenden Entitäten.
‚ Zusätzlich wird ein sogennantes Diskriminatorfeld
in die Tabelle eingetragen.
‚ Mit dem Diskriminator wird differenziert welcher
Datensatz ursprünglich welcher Entität zugeordnet
war.

17
Informationssysteme

Abbildung 4. Single Table Strategie

 Erklärung: Joined Table Strategie  1.3.6 Namenskonventionen


‚ Jede Entität, die in einer Vererbungsbeziehung
Für das Relationale Modell gelten gewisse Konven-
steht, wird auf eine eigene Tabelle abgebildet.
tionen bei der Benennung von Objekte.
‚ Für die so erzeugten Tabellen werden keine Fremd-
schlüsselfelder eingetragen.  Auflistung: Namenskonventionen 
‚ Um beispielsweise einen Schülerdatensatz aus der ‚ Wählen Sie für die Namen der Objekte des Modells
Datenbank auszulesen werden zunächst die Schüler- immer die Sprache, die der Großteil ihrer Anwender
daten aus der Person Tabelle ausgelesen verwendet.

‚ Anschließend werden die verbeleibenden Daten aus ‚ Die Namen von Entitäten sollten stets im Plural
der Schüler Tabelle ausgelesen. formuliert sein.

‚ Der Trick dabei ist das sowohl in der Person- als ‚ Die Namen von Feldern solle im Singular formuliert
auch in der Schüler Tabelle der selbe Wert für den sein.
Schlüssel eingetragen ist.
‚ Verwenden Sie für Schlüssel stets das Postfix ID.
q
q

18
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 5. Joined Table Strategie

. .

19
Informationssysteme

1.3.5 Fallbeispiel: Transformieren eines ER Modells auf ein Relationales Modell

. .

20
Informationssysteme - Theorieskriptum
.

Oracle SQL
October 6, 2019
Informationssysteme

2. SQL - Data Query Lanuguage 2.1. SQL Grundlagen 


SQL ist eine Programmiersprache, mit der relationale
Datenbanken erstellt bzw. bearbeitet, sowie Datenbe-
stände abgefragt werden können.

2.1.1 SQL - Structured Query Language


SQL als Programmiersprache folgt dem deklarati-
ven Programmierparadigma.

 Erklärung: Deklarative Programmierung 


‚ Die deklarative Programmierung ist ein Program-
mierparadigma, bei dem ein Problem durch den
Programmierer beschrieben, jedoch kein Lösungs-
weg vorgegeben wird.

Es ist die Aufgabe der Datenbankengine eine Lösung


zu berechnen.

01. SQL Grundlagen 22

02. Projektion - Select Klausel 24

03. Kondition - Case Klausel 28

04. Restriktion - Where Klausel 29

05. Sortierung - Order By Klausel 32


 Erklärung: SQL Syntax 

06. Limitierung - Fetch Klausel 33


‚ SQL als Programmiersprache zeichnet sich durch ei-
ne einfache Syntax aus. Die Sprache selbst besteht
dabei im Wesentlichen aus englischen Sprachelemen-
07. Paginierung - Offset Klausel 33
ten.
‚ SQL als Sprache ist standardisiert und wird Platt-
formunabhängig in relationalen Datenbanksystemen
eingesetzt. Es existieren jedoch mehrere SQL Dialek-
te unterschiedlicher Hersteller, die eine vollständige
Kompatibilität des Standards verhindern.

2.1.2 Kategorien von SQL Befehlen

Der SQL Befehlssatz ist in mehrere Kategorien


aufgeteilt.

 Auflistung: Kategorien von SQL Befehlen 

22
© Dipl.Ing.-Paul Panhofer Bsc.

‚ Data Manipulation Language: Befehle zum Ver- 2.1.3 DQL - Select Anweisung
arbeiten von Daten.
Die select Anweisung wird verwendet um Daten aus
‚ Data Definition Language: Befehle zum Definieren einer relationalen Datenbank zu lesen.
der Struktur einer Datenbank.

‚ Data Query Language: Befehle zum Auslesen von


Daten aus einer Datenbank.
L | 
 Erklärung: Select Anweisung 
 Begriff: DML Befehlsatz 
‚ Die select Anweisung wird verwendet um Daten aus
DML Befehle werden zum Bearbeiten, Einfügen und den Tabellen einer Datenbank zu lesen.
Löschen von Daten verwendet.
Die Anweisung selbst besteht aus mehreren Segmen-
1 -- Einfuegen von Daten ten - den Klauseln. Jede Klausel erfüllt eine spe-
2 INSERT INTO ... zifische Aufgabe. Die select Anweisung besteht da-
3 -- Veraendern von Daten bei immer zumindestens aus 2 Klauseln: der select
4 UPDATE employees ... Klausel und der from Klausel. Alle anderen Klau-
5 -- Loeschen von Daten seln sind optional.
6 DELETE FROM ...
‚ Die Klauseln der select Anweisung werden von der
Datenbankengine nicht in der Reihenfolge ausge-
 Begriff: DDL Befehlsatz 
wertet, in der sie in der Abfrage auftretten.
DDL Befehle werden zur Definition des Schemas2 ei-
ner Datenbank verwendet. ‚ Welche Daten, zu welchem Zeitpunkt, auf welche
1 -- Anlegen von Tabellen Weise verarbeitet werden, wird durch die Art der
Klausel bestimmt.
2 CREATE TABLE ...
3 -- Aendern von Tabellen ‚ Auswertungsreihenfolge SQL Klauseln:
4 ALTER TABLE ...

 Begriff: DCL Befehlsatz  select Anweisung

DCL Befehle werden zum Verwalten von Rechten


bzw. zur Steuerung von Transaktionen verwendet.
from where group by select order by
1 -- Weitergabe von Rechten fuer den
2 -- Zugriff auf Tabellen
3 GRANT ON TO ...
4 -- Beenden einer Transaktion having
5 COMMIT ...
 Auflistung: Klauseln der Select Anweisung 
 Begriff: DQL Befehlsatz 
DQL Befehle werden zum Auslesen von Daten aus  From Klausel - Projektion 
der Datenbank verwendet.
In der from Klausel wird die Datenbasis einer
1 -- Daten aus der Datenbank lesen Abfrage festgelegt.
2 SELECT employee_id FROM ...
Die Klausel ist obligatorisch.
q

ü Where Klausel - Restriktion 


Die where Klausel wird zur Filterung der Daten-
sätze einer Abfrage verwendet.

2
Beschreibung der Struktur der Daten in der Daten- Die where Klausel ist optional.
bank

23
Informationssysteme

2.2. Select Klausel - Projektion 


 Group By - Reporting 
Mit der group by Klausel kann die Struktur der 2.2.1 Select Klausel
Daten einer Abfrage verändert werden.
In der select Klausel werden jene Spalten definiert,
Die group by Klausel ist optional. deren Werte die Ergebnismenge einer Abfrage bil-
den.

ü Select Klausel - Projektion   Query: Select Anweisung 


1 -- ----------------------------------------
In der select Klausel wird definiert welcher Teil
2 -- Select Anweisung
der Daten in der Ergebnismenge einer Abfra-
3 -- ----------------------------------------
ge enthalten sein soll.
4 SELECT * FROM employees;
Die Klausel ist obligatorisch.
 Analyse: Select Anweisung 

( Order By Klausel - Sortierung  ‚ Hier steht gewissermassen der Satz: Wähle alle Spal-
ten der Tabelle employees und zeige die Daten als
Mit der order By Klausel wird eine Sortie- Ergebnis an.
rung der Datensätze des Abfrageergebnisses
durchgeführt. ‚ Am Ende der select Anweisung steht ein Semikolon.
Das Semikolon ist dabei nicht Teil der select Anwei-
Die order by Klausel ist optional. sung, sondern ein Steuerzeichen der Datenbank.

 Query: Projektion von Daten 


_ Fetch Klausel - Limitierung 
1 -- ----------------------------------------
Mit der fetch Klausel wird das Abfrageergeb- 2 -- Projektion von Daten
nis auf eine bestimmte Zahl von Datensätzen 3 -- ----------------------------------------
eingeschränkt. 4 SELECT DISTINCT first_name, last_name,
5 department_id, job_id
Die fetch Klausel ist optional. 6 FROM employees;

n Offset Klausel - Ausschluss   Erklärung: Projektion von Daten 

Mit der offset Klausel werden die ersten n Da-


‚ Soll für eine SQL Abfrage die Spaltenauswahl
der Ergebnismenge eingeschränkt werden, wird eine
tensätze des Abfrageergebnisses ignoriert .
durch Komma getrennte Liste von Spaltenbezeich-
Die offset Klausel ist optional. nern in der select Klausel definiert.

‚ Die select Klausel bestimmt damit, welcher Teil der


q Daten, in der Ergebnismenge einer Abfrage enthal-
ten sein soll.

‚ Mit dem distinct Schlüsselwort kann die Daten-


bankengine angehalten werden, Duplikate aus dem
Abfrageergebnis zu entfernen.

24
© Dipl.Ing.-Paul Panhofer Bsc.

2.2.2 Wiederholte Spaltenausgabe 2.2.4 Spaltenwerte verknüpfen

In der select Klausel kann die Angabe von Spaltenbe- Zur Bearbeitung alphanumerischer Werte stellt SQL
zeichnern in beliebiger Reihenfolge bzw. in beliebiger den || Operator zur Verfügung.
Zahl erfolgen.
 Erklärung: Spaltenwerte verknüpfen 
 Erklärung: Wiederholte Spaltenausgabe  ‚ SQL verwendet den || Operator um alphanumeri-
‚ In der select Klausel können dieselben Spaltenbe- sche Werte miteinander zuverknüpfen.
zeichner mehrfach angegeben werden.
‚ Der || Operator kann dabei beliebig oft in einem
‚ Die Ausgabe der Daten erfolgt dabei entsprechend, SQL Ausdruck auftreten.
der in der Klausel definierten Reihenfolge der Spal-
tenbezeichner.  Query: Spaltenwerte verknüpfen 
1 -- ----------------------------------------
 Query: Wiederholte Spaltenausgabe 
2 -- Alphanumerische Werte verknuepfen
1 -- ---------------------------------------- 3 -- ----------------------------------------
2 -- Wiederholte Spaltenausgabe 4 SELECT last_name || ’ ’
3 -- ---------------------------------------- 5 || first_name
4 SELECT last_name, first_name, department_id, 6 FROM employees;
5 salary,
6 salary
q
7 FROM employees;
8

9 SELECT department_id, department_name, 2.2.5 Spaltenalias


10 department_head,
11 department_code, Aliase sind alternative Namen für Spaltenbezeichner.
12 department_name
Der Spaltenalias maskiert den eigentlichen Spalten-
13 FROM departments;
namen durch eine sprechende Bezeichnung.

q  Erklärung: Spaltenalias 
‚ Ein Spaltenalias wird durch ein Leerzeichen ge-
2.2.3 Spaltenwerte bearbeiten trennt, hinter der Spaltenbezeichnung bzw. dem
Ausdruck angegeben, deren Bezeichnung maskiert
Daten können vor ihrer Ausgabe durch die select Klau- werden soll.
sel algebraisch bearbeitet werden.
‚ Klauseln die von der SQL Engine nach der select
 Query: Spaltenwerten algebraisch bearbeiten  Klausel ausgewertet werden, besitzen eine Referenz
1 -- ---------------------------------------- auf Spaltenaliase.
2 -- Mit Spaltenwerten rechnen ‚ Enthält ein Spaltenalias Sonderzeichen, muß es un-
3 -- ---------------------------------------- ter Hochkomma gesetzt werden.
4 SELECT employee_id, last_name, first_name,
5 salary * 1.03,
 Query: Spaltenaliase definieren 
6 salary * 1.10,
1 -- ----------------------------------------
7 salary - (salary * 0.8)
2 -- Spaltenaliase definieren
8 FROM employees;
3 -- ----------------------------------------
4 SELECT last_name nachname, job_id beruf
 Analyse: Spaltenwerte bearbeiten  5 FROM employees;
‚ Durch die Anweisung wird zusätzlich zum Gehalt 6

das um 3% erhöhte Gehalt ausgegeben. 7 SELECT department_name "Abteilungsbezeichnung


Endbericht"
‚ Alphanumerische Werte können im Rahmen einer
8 FROM departments;
Projektion nicht algebraisch verändert werden.

q q

25
Informationssysteme

2.2.6 Pseudospalten 2.2.7 Pseudospalten: nextval, currval

Als Pseudospalten wird in SQL eine spezifische Form Eine Sequenz ist wie eine Tabelle ein Datenbankobjekt.
von Spalten bezeichnet. Mit einer Sequenz können numerische Werte für SQL
Abfragen generiert werden.

L Pseudospalte   Erklärung: Sequenzen in SQL Abfragen 


Die SQL Spezifikation definiert 2 Formen von ‚ Sequenzen werden in erster Linie zum Generieren
Pseudospalten: Funktionen und Spaltenaliase: von Schlüsselwerten für Datenbanktabellen ver-
wendet.
‚ Funktionen: Die SQL Spezifikation, definiert
eine Reihe von Funktionen die in SQL Ab-  Query: NEXTVAL, CURRVAL 
fragen als Teil der select Klausel verwendet
1 -- ----------------------------------------
werden können.
2 -- Pseudospalte: NEXTVAL
‚ Spaltenaliase: Ein Pseudospalten Spaltena- 3 -- ----------------------------------------
lias ist ein symbolischer Alias auf die Spalten 4 -- Die NEXTVAL Pseudospalte liefert den
anderer Tabellen. 5 -- naechsten Werte der Sequenz.
6

7 SELECT employee_seq.NEXTVAL FROM DUAL;


Pseudospalten können in SQL Abfragen wie ge-
8 -- ----------------------------------------
wöhnliche Spalten verwendet werden. Es können je-
9 -- Pseudospalte: CURRVAL
doch keine Werte für diese Spalten eingetragen wer-
10 -- ----------------------------------------
den.
11 -- Die CURRVAL Pseudospalte liefert den akt-
 Query: Pseudospalten  12 -- uellen Wert der Sequenz. Der Wert entspr-
1 -- ---------------------------------------- 13 -- icht dabei dem Wert, der beim letzten Auf-
2 -- Pseudospalte: ROWNUM 14 -- ruf von SEQUENCE_NAME.NEXTVAL generiert
3 -- ---------------------------------------- 15 -- worden ist.
16
4 -- Das Ergebnis der Abfrage setzt sich aus
5 -- den ersten 10 Datensaetze des Ergebnisses 17 SELECT employee_seq.CURRVAL FROM DUAL;
6 -- zusammen.
7 q
8 SELECT * FROM employees WHERE ROWNUM < 10;
9 -- ----------------------------------------
10 -- Pseudospalte: SYSDATE
11 -- ----------------------------------------
12 -- Das Ergebnis der Abfrage enthaelt die
2.2.8 Pseudospalte: rownum
13 -- gegenwaertigen Zeit des Datenbankservers
14 Jedem Ergebnisdatensatz einer SQL Abfrage wird
15 eine Numer entsprechend seiner Position im Ergebnis
16 -- z.B.: 2017-11-23 23:41:08 zugeordnet.
17
 Query: Pseudospalte ROWNUM 
18 SELECT SYSDATE FROM DUAL;
19 -- ---------------------------------------- 1 -- ----------------------------------------
20 -- Pseudospalte: TIMESTAMP 2 -- Pseudospalte: ROWNUM
21 -- ---------------------------------------- 3 -- ----------------------------------------
22 -- Das Ergebnis der Abfrage enthaelt die 4 -- Das Ergebnis werde die ersten 100 Daten-
23 -- gegenwaertigen Zeit des Datenbankservers 5 -- saetze der Abfrage zurueckgegeben.
6
24 -- auf Millisekunden genau.
25
7 SELECT rownum, last_name, first_name
26 SELECT TIMESTAMP FROM DUAL; 8 FROM employees
9 WHERE rownum < 101;

q
q

26
© Dipl.Ing.-Paul Panhofer Bsc.

Operator Beschreibung Sql Beispiel

ROWNUM Jedem Ergebnisdatensatz einer SQL Abfrage wird eine SELECT * FROM employees WHERE ROWNUM < 10
Numer entsprechend seiner Position im Ergebnis der Ab-
frage zugeordnet.

SYSDATE Die Pseudospalten SYSDATE Funktion ermöglicht den Zu- SELECT SYSDATE FROM DUAL
griff auf die interne Zeit des Datenbankservers.

TIMESTAMP Die Pseudospalten TIMESTAMP Funktion ermöglicht den SELECT TIMESTAMP FROM DUAL
Zugriff auf die interne Zeit des Datenbankservers.

USER Die USER Pseudospalte ermöglicht den Zugriff auf den SELECT USER, UID FROM DUAL
Namen des eingeloggten Benutzers der gegenwärti-
gen Datenbanksession.

UID Die UID Pseudospalte ermöglicht den Zugriff auf die SELECT USER, UID FROM DUAL
ID des eingeloggten Benutzers der gegenwärtigen
Datenbansession.

CURRVAL Die CURRVAL Pseudospalte liefert den aktuellen Wert der SELECT employee_seq.CURRVAL FROM DUAL
Sequenz. Der Werte entspricht dabei dem Wert, der
beim letzten Aufruf von SEQUENCE_NAME.NEXTVAL gene-
riert worden ist.

NEXTVAL Die NEXTVAL Pseudospalte liefert den nächsten Wert der SELECT employee_seq.NEXTVAL FROM DUAL
Sequenz.

Abbildung 6. Pseudospalten

2.2.9 Pseudospalten: user, uid 2.2.10 Pseudospalten: sysdate, timestamp

Die USER bzw. UID Pseudospalten ermöglichen den Zu- Die SYSDATE bzw. TIMESTAMP Pseudospalte ermöglicht
griff auf die Daten des eingeloggten Users. den Zugriff auf die interne Zeit des Datenbankservers.

 Query: Pseudospalten USER, UID   Query: sysdate, timestamp 


1 -- ---------------------------------------- 1 -- ----------------------------------------
2 -- Pseudospalte: USER 2 -- Pseudospalte: SYSDATE
3 -- ---------------------------------------- 3 -- ----------------------------------------
4 -- Die USER Pseudospalte ermoeglicht den 4 -- Die SYSDATE Pseudospalte ermoeglicht den
5 -- Zugriff auf den Namen des eingeloggten 5 -- Zugriff auf die interne Zeit des Daten-
6 -- Users. 6 -- bankservers.
7 7

8 SELECT USER, EMPLOYEES_ID FROM employees; 8 SELECT SYSDATE FROM DUAL;


9 -- ---------------------------------------- 9 -- ----------------------------------------
10 -- Pseudospalte: UID 10 -- Pseudospalte: TIMESTAMP
11 -- ---------------------------------------- 11 -- ----------------------------------------
12 -- Die UID Pseudospalte ermoeglicht den Zu- 12 -- Die TIMESTAMP Pseudospalte ermoeglicht
13 -- griff auf die ID des eingeloggten Benut- 13 -- den Zugriff auf die interne Zeit des
14 -- zers der gegenwaertigen Datenbanksession. 14 -- Datenbankservers.
15 15

16 SELECT UID, LAST_NAME FROM employees; 16 SELECT TIMESTAMP FROM DUAL;

q q

27
Informationssysteme

2.3. Case Klausel - Kondition  2.3.2 Case Klauseln in select Abfragen

SQL als deklarative Programmiersprache unter- Die case Klausel zeigt im Vergleich zu anderen Klau-
stützt keine Konstrukte zur Steuerung des Program- seln mehr das Verhalten eines Operators als einer
mablaufs3 . Klausel.

Mit der case Klausel definiert die SQL Spezifikation Die case Klausel kann dabei nur im Kontext einer
jedoch einen Bedingungsoperator, der das Ergeb- anderen Klausel ausgewertet werden.
nis einer Abfrage in konditionale Abhängigkeit zum
 Query: Case Klausel 
Datenbestand setzt.
1 -- ----------------------------------------
2 -- Fallbeispiele : CASE in ORDER BY
2.3.1 Case Klausel 3 -- ----------------------------------------
4 SELECT country_id, first_name, last_name
5 FROM employees
L Case Klausel - Kondition 
6 ORDER BY
Die case Klausel ermöglicht eine konditiona- 7 CASE
le Verarbeitung des Datenbestands einer SQL 8 WHEN location_id IS NULL THEN country_id
Abfrage. 9 ELSE location_id
10 END;
Die Case Klausel zeigt dabei dasselbe Verhalten wie 11

der ?: Operator imperativer Programmiersprachen. 12 -- ----------------------------------------


13 -- Fallbeispiele : CASE in SELECT
 Syntax: Case Klausel  14 -- ----------------------------------------
15 SELECT first_name, last_name,
1 -- ----------------------------------------
16 CASE
2 -- Syntax : CASE Klausel
17 WHEN salary <= 1000
3 -- ----------------------------------------
18 THEN ’low income’
4 CASE WHEN <condition> THEN <result>
19 WHEN salary BETWEEN 10000 AND 20000
5 [WHEN <condition> THEN <result>
20 THEN ’medium income’
6 [WHEN <condition> THEN <result>
21 WHEN salary BETWEEN 20001 AND 40000
7 ...]
22 THEN ’upper income’
8 [ELSE <result>] +
23 WHEN salary BETWEEN 40001 AND 80000
9 END
24 THEN ’ceo’
25 ELSE null
 Erklärung: Case Klausel 
26 END AS income
‚ Für eine Case Klausel können mehrere <when then> 27 FROM employees
Paare definiert werden. Jedes <when then> Paar for- 28 ORDER BY last_name, first_name;
muliert dabei eine Bedingung. Das Ergebnis der 29
Auswertung der Case Klausel ist das Resultat des 30 -- ----------------------------------------
ersten wahren <when then> Paares. 31 -- Fallbeispiele : CASE in WHERE
‚ Syntaktisch gelten für Bedingungen der case und 32 -- ----------------------------------------
where Klausel dieselben Regeln. 33 SELECT first_name, last_name
34 FROM employees
‚ Der else Zweig der case Klausel kommt immer dann 35 WHERE salary >
zur Ausführung, wenn keine der Bedingungen der 36 CASE
vorangegangenen when then Paare zutreffen. Wird 37 WHEN department_id = 106 THEN 1000
kein else Zweig definiert, wird er als else null an- 38 WHEN department_id = 107 THEN 2000
genommen. 39 END
40 ORDER BY last_name;
q

q
3
Kontroll- bzw. Schleifenstrukture

28
© Dipl.Ing.-Paul Panhofer Bsc.

2.4. Where Klausel - Restriktion  2.4.2 Abfrageobjekt

Ein Abfrageobjekt wird zum Filtern der Daten einer


L Where Klausel - Restriktion  Abfrage verwendet.

Zur Filterung der Datensätze einer Abfrage Grundsätzlich formuliert ein Abfrageobjekt eine Be-
können in der where Klausel Bedingungen de- dingung in Form einer mathematischen Aussage.
finiert werden.

Die where Klausel ist optional.  Erklärung: Abfrageobjekt 


‚ Eine Bedingung ist eine Funktion, die immer zu true
oder falsch evaluiert.
2.4.1 Restriktion ‚ Ein Abfrageobjekt kann durch die Kombination
mathematischer Aussagen weiter präzisiert werden.
Zur Filterung der Datensätzen einer Abfrage können
in der where Klausel Bedingungen formuliert werden. ‚ Zur Kombination mathematischer Aussagen werden
logische Operatoren verwendet.
Mit der where Klausel können Restriktionen für die
Daten einer Abfrage definiert werden. q

 Erklärung: where Klausel 


2.4.3 Logische Operatoren - and, or, not, xor
‚ Innerhalb der where Klausel werden Bedingungen
definiert, die für jeden Datensatz der Datenbasis ge-
prüft werden. L Verknüpfungsoperatoren 

‚ Evaluiert die Prüfung einer Bedingung für einen Da- Verknüpfungsoperatoren werden verwendet
tensatz nicht zu true, wird der Datensatz aus der um Bedingungen miteinander zu verknüpfen.
Datenbasis der Abfrage entfernt. Die SQL Spezifikation definiert dazu die Ver-
knüpfungsoperatoren and, or, not und xor.
 Query: where Klausel - Datenfilterung 
1 -- ----------------------------------------  Erklärung: Logische Operatoren 
2 -- WHERE Klausel
3 -- ----------------------------------------
‚ Zur Formulierung komplexer Bedingungen werden
die logischen Operatoren and, or bzw not verwen-
4 SELECT last_name, first_name, job_id,
det. Hit Hilfe dieser Operatoren können mehrere Be-
5 department_id,
dingungen miteinander verknüpft werden.
6 salary
7 FROM employees
8 WHERE job_id = ’SA_MAN’  Query: Logische Operatoren: 
9 ORDER BY last_name, first_name; 1 -- ----------------------------------------
10 2 -- logische Operatoren: and, or, not
11 SELECT last_name, first_name 3 -- ----------------------------------------
12 FROM employees 4 SELECT last_name, first_name, salary,
13 WHERE salary > 4000; 5 department_name,
6 department_id
q 7 FROM employess
8 WHERE
9 (job_id = ’CLERK’ or job_id = ’MAN’)
10 and
11 (salary > 100 or last_name = ’Mel’)
12 ORDER BY last_name, first_name;

29
Informationssysteme

2.4.4 Logischer Operator - like 2.4.6 Logischer Operator - is

Der like Operator ermöglicht es Zeichenketten auf das Mit dem is Operator kann geprüft werden, ob der Wert
Vorhandensein bestimmter Zeichenfolgen zu prüfen. einer bestimmten Spalte bekannt ist.

Zur Beschreibung der Zeichenfolge wird eine soge-  Erklärung: is Operator 


nannte Suchmaske formuliert. Die SQL Spezifikati- ‚ Der Vergleich last_name = null wird unabhängig
on definiert dazu zwei Platzhaltertoken. von dem in der last_name Spalte gespeichertem
Wert immer false ergeben.
 Erklärung: Platzhaltertoken 
‚ Der Grund dafür ist das der Vergleich null = null
‚ Der % Token steht stellvertretend für eine beliebige stets zu false evaluiert.
Zahl von Zeichen.
‚ Zur Prüfung auf null muß der is Operator verwendet
‚ Der _ Token wird als Platzhalter für ein beliebiges werden.
Zeichen verwendet.
 Query: Prüfung auf null Werte 
 Query: Patternmatching  1 -- ----------------------------------------
1 -- ---------------------------------------- 2 -- logischer Operator - in
2 -- logischer Operator - like 3 -- ----------------------------------------
3 -- ---------------------------------------- 4 SELECT last_name, first_name, department_id
4 SELECT last_name, first_name, department_id 5 FROM employees
5 FROM employees 6 WHERE commission_pct is not null;
6 WHERE last_name like ’M%’;
7 q
8 SELECT last_name, first_name. job_id, salary
9 FROM employess
2.4.7 Logischer Operator - between
10 WHERE last_name like ’_A%’;
Um zu prüfen ob ein Wert in einem Intervall von Wer-
q
ten enthalten ist wird, der between Operator verwen-
det.
 Query: between Operator 
2.4.5 Logischer Operator - in
1 -- ----------------------------------------
Mit dem in Operator kann geprüft werden, ob ein be- 2 -- logischer Opertor - between
stimmter Wert in einer Liste von Werten enthalten ist. 3 -- ----------------------------------------
4 SELECT last_name, first_name, department_id
 Query: in Operator  5 FROM employees
1 -- ---------------------------------------- 6 WHERE
2 -- logischer Operator - in 7 salaray between 10000 and 14000;
8
3 -- ----------------------------------------
9
4 SELECT last_name, job_id, salary
5 FROM employess 10 -- ----------------------------------------
6 WHERE job_id in (’SA_REP’, ’SA_CLERK’); 11 -- logischer Operator - between
12 -- ----------------------------------------
13 SELECT last_name, first_name, department_id,
 Analyse: in Operator  14 department_id,
15 salary
‚ Wir suchen alle Mitarbeiter deren Berufsbezeich-
16 FROM employees
nung entweder SA_REP oder SA_CLERK ist.
17 WHERE birthday between
‚ Der in Operator kann in Verbindung mit nume- 18 to_date(’10.01.1950’, ’dd.mm.yyyy’)
rischen bzw. alphanumerischen Werten verwendet 19 and
werden. 20 to_date(’10.01.1955’, ’dd.mm.yyyy’);

q
q

30
© Dipl.Ing.-Paul Panhofer Bsc.

Operator Beschreibung Sql Beispiel

and Die Verknüpfung logischer Terme mit einem and wird als first_name like ’A_’ and salary > 1000
Konjunktion bezeichnet. Eine Konjunktion ist wahr wenn je-
der angegebene logische Term wahr ist.

or Die Verknüpfung logischer Terme mit einem or wird als Dis- salary < 0 or salary > 20000
junktion bezeichnet. Ein Disjunktion ist wahr wenn einer der
angegebenen Terme wahr ist.

not Die Negation ist ein Operator zur Verneinung logischer not salary = 2000
Aussagen

in Der in Operator prüft ob ein gegebener Wert in einer Liste department_id in (106, 107, 109)
von Werten enthalten ist.

like Der like Operator prüft alphanumerische Werte auf das Vor- first_name like K%
handensein von Mustern.

is Der is Operator prüft ob der Wert für eine bestimmte Spalte department_id is not null
bekannt ist.

between Der between Operator prüft ob ein Wert in einem Intervall salary between 10000 and 14000
von Werten enthalten ist.

Abbildung 7. Logische Operatoren

2.4.8 Dreiwertige Logik  Erklärung: Dreiwertige Logik 


‚ Wir möchten berechnen, wie hoch das tatsächliche
L Dreiwertige Logik  Jahresgehalt eines Angestellten ist.

Die SQL Spezifikation kennt zum Unterschied ‚ Die Spalte commission_pct enthält null Werte. Be-
zu anderen Programmiersprachen 3 Wahr- rechnungen auf null Werten sind problematisch.
heitswerte: true, false und null. Wird z.B.: zu einer Zahl eine unbekannte Zahl ad-
diert, ist das Ergebnis wieder eine unbekannte Zahl.
Der null Wert kann mit nichts verglichen werden, ‚ Zur Verarbeitung von Nullwerten definiert die SQL
er ist weder falsch noch wahr sondern eben einfach Spezifikation die coalesce Funktion.
unbekannt.
Die coalesce Funktion erlaubt die Angabe eines
and t f n or t f n Defaultwerts, der immer dann herangezogen wird,
t t f n t t t t wenn der Spaltenwert eines Datensatzes unbekannt
f f f f f t f n ist.
n n f n n t n n  Query: Mit Nullwerten arbeiten 
1 -- ----------------------------------------
Mit dem null Wert verlassen wir die Welt der intuitiv 2 -- Mit Nullwerten arbeiten
erfassbaren Logik und führen eine dreiwertige Logik 3 -- ----------------------------------------
ein, die neben wahr und falsch noch unbekannt als 4 SELECT last_name, first_name,
Wahrheitswert kennt. Der null Wert kann mit nichts 5 department_id,
verglichen werden. Die Negation eines unbekannten 6 (salary * 12) +
Werts ist selbst wieder unbekannt. 7 coalesce(commission_pct, 0.3)
8 FROM employees;

31
Informationssysteme

2.5. Order by Klausel - Sortierung  2.5.2 Sortierreihenfolge - asc/desc

Durch die Angabe des asc bzw. desc Schlüsselworts


kann die Art der Sortierung zusätzlich präzisiert wer-
L Order By Klausel - Sortierung 
den.
Mit der order by Klausel kann eine Sortierung
 Query: Sortieren des Abfrageergebnisses 
der Datensätze eines Abfrageergebnisses de-
finiert werden. 1 -- ----------------------------------------
2 -- ORDER BY Klausel - ACS, DESC
Die order by Klausel ist optional. 3 -- ----------------------------------------
4 SELECT last_name, first_name, department_id,
5 department_name,
6 salary
2.5.1 Order By Klausel
7 FROM employees
Mit der order by Klausel kann eine Sortierung der 8 WHERE department_id = 30
Datensätze eines Abfrageergebnisses definiert werden. 9 ORDER BY last_name ASC, salary DESC;

Beachten Sie, dass nur nach Spalten sortiert werden


 Analyse: Sortierung 
kann, die Teil der Projektion der select Klausel sind.
‚ Im Beispiel wird das Abfrageergebnis zuerst aufstei-
 Query: Einsatz der Order By Klausel  gend nach den Werten der last_name Spalte sor-
tiert.
1 -- ----------------------------------------
2 -- ORDER BY Klausel ‚ Treten in der last_name Spalte Datensätze mit glei-
3 -- ---------------------------------------- chen Werten auf, werden diese Zeilen absteigend
4 SELECT last_name, first_name, department_id, nach den Werten der salary Spalte sortiert.
5 department_name,
6 job_id q
7 FROM employees
8 WHERE department_id = 30
2.5.3 Optionen - nulls first und nulls last
9 ORDER BY last_name;
Eine letzte Erweiterung der order by Klausel betrifft
 Analyse: Order Klausel  die Behandlung von null Werten.

‚ Es werden alle Mitarbeiter der Abteilung 30, sortiert


 Erklärung: Null Werte 
nach ihren Nachnamen, ausgeben.
‚ Mit dem nulls first bzw. nulls last Schlüssel-
‚ Reihenfolge der Auswertung der Klauseln: wort werden Datensätze, die Null Werte enthal-
ten, summarisch dem Ergebnis entweder voran- bzw.
nachgestellt.
select Anweisung
 Query: Null Werte 
1 -- ----------------------------------------
2 -- ORDER BY Klausel - Null Werte
from where select order by
3 -- ----------------------------------------
4 SELECT last_name, first_name, department_id,
5 department_name,
offset 6 job_id,
7 FROM employees
8 WHERE department_id = 30
9 ORDER BY last_name ASC,
fetch
10 first_name ASC
11 NULLS FIRST;
q
q

32
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 8. Paginierung von Daten

2.6. Fetch Klausel - Limitierung  2.7. Offset Klausel - Paginierung 


Mit der offset Klausel kann ein seitenweiser Zugriff auf
L Fetch Klausel - Limitierung  das Ergebnis einer Abfrage definiert werden.
Mit der fetch Klausel kann das Abfrageergeb-
nis auf eine bestimmte Zahl von Datensätzen 2.7.1 Offset Klausel
beschränkt werden. Mit der offset Klausel können die ersten n Datensätze
eines Abfrageergebnisses entfernt werden.
Die fetch Klausel ist optional.
 Query: offset Klausel 
Der Einsatz der fetch Klausel macht nur dann Sinn, 1 -- ----------------------------------------
wenn das Abfrageergebnis in sortierter Form vor- 2 -- OFFSET Klausel
liegt. 3 -- ----------------------------------------
4 -- Paginierung des Abfrageergebnisses
5 -- Ergebnis: Datensaetze 21 - 40
2.6.1 Fetch Klausel
6 SELECT last_name, first_name, middle_name
Mit der fetch Klausel wird ein Abfrageergebnis auf die 7 department_name,
ersten N Datensätze beschränkt werden. 8 departemtn_id,
9 salary
 Query: Einsatz der fetch Klausel  10 FROM employees
1 -- ---------------------------------------- 11 ORDER BY last_name ASC,
2 -- FETCH Klausel - Anzahl der Datensaetze 12 first_name ASC
3 -- ---------------------------------------- 13 OFFSET 20 ROWS
4 SELECT last_name, first_name, department_id 14 FETCH NEXT 20 ROWS ONLY;
5 FROM employees
6 ORDER BY salary DESC
 Erklärung: Offset Klausel 
7 FETCH FIRST 5 ROWS ONLY;
8
‚ Die offset Klausel zusammen mit der fetch Klausel
werden verwendet um eine Paginierung des Abfra-
9 -- ----------------------------------------
geergebnises zu definieren.
10 -- FETCH Klausel - Prozentangabe
11 -- ---------------------------------------- ‚ Eine Paginierung des Abfrageergebnisses erlaubt
12 SELECT last_name, first_name, job_id den seitenweisen Zugriff auf die Datensätze einer Ab-
13 FROM employees frage.
14 ORDER BY salary DESC
‚ Vermeiden sie Full Table Scans in der Anwendungs-
15 FETCH FIRST 20 PERCENT ROWS ONLY;
entwicklung!

q q

33
Informationssysteme

3. SQL - Datenaggregation 3.1. Datenmodellierung 

3.1.1 Relationale Modellierung

L Relationale Modell 
Das Relationale Modell beschreibt die grund-
legende Tabellen- bzw. Beziehungsstruktur ei-
ner relationalen Datenbank.

 Erklärung: Relationale Modellierung 


‚ Bei der Arbeit mit relationalen Datenbanken wer-
den die Geschäftsobjekte einer Anwendung auf eine
Menge von Tabellen verteilt.
‚ Jede Tabelle repräsentiert dabei einem bestimmten
Aspekt der Wirklichkeit.

‚ Das Aufteilen der Daten auf einzelne Tabellen ver-


hindert dabei das wiederholte Speichern der selben
Information in einer Datenbank.
01. Datenmodellierung 34 ‚ Beim Formulieren einer SQL Abfrage stehen wir da-
mit oft vor der Herausforderung, die Daten wieder
02. From Klausel 35 so zusammenzustellen, so dass das ursprüngliche Ge-
schäftsobjekt wieder zum Vorschein kommt.
03. Relationale Join 35
q

3.1.2 Datenaggregation

Datenaggregation beschreibt den Prozess der Verdich-


tung einzelner Aspekte der Geschäftdaten zu neuen
Geschäftsobjekten.
 Erklärung: Datenaggregation 
‚ Mit dem Aufteilen der Daten auf getrennte Aspek-
te, können Datensätze ihrerseits wiederum zu neuen
Geschäftsobjekten zusammengesetzt werden.
‚ Durch die geschickte Kombination der Aspekte kann
damit aus den gegebenen Daten neue Information
gewonnen werden.

‚ Die technische Grundlage der Datenaggregation


ist der relationale Join. Ein relationaler Join be-
schreibt die logische Verbindung zweier Datensät-
zen unterschiedlicher Tabellen. Relationale Daten-
banken unterstützen dabei mehrere Formen des re-
lationalen Joins.

‚ In SQL Abfragen können relationale Joins in der


from Klausel definiert werden.

34
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 9. Datenbankobjekte der from Klausel

3.2. From Klausel  3.3. Relationale Join 


In der from Klausel einer select Anweisung wird die Ein relationaler Join definiert eine logische Verbin-
Datenbasis einer Abfrage definiert. dung zwischen 2 Datenbankobjekten.

3.2.1 Grundlagen 3.3.1 Virtuelle Tabellen


SQL Abfragen basieren auf der in der from Klausel Das Ergebnis eines Joins wird in einer neuen virtuellen
definierten Datenbasis. Tabelle gespeichert.
 Erklärung: From Klausel 
 Erklärung: Datenbasis einer Abfrage 
‚ Für select Anweisungen ist die from Klausel obliga-
torisch. Die Klausel wird vor der Auswertung jeder ‚ In der from Klausel einer select Anweisung wird
anderen Klausel einer SQL Abfrage ausgeführt. die Datenbasis einer select Abfrage definiert. Für
komplexe Abfragen können Datenbankobjekte da-
‚ Zur Definition der Datenbasis einer Abfrage wer-
bei über einen relationalen Join in Beziehung gesetzt
den in der from Klausel jene Datenbankobjekte an-
werden.
gegeben, die die gewünschten Daten halten. Mög-
liche Datenbankobjekte sind dabei Tabellen, Views ‚ Das Ergebnis der Auswertung eines relationalen
bzw. Subselects. Joins wird in einer virtuellen Tabelle gespeichert.

‚ Für komplexe Abfragen können Datenbankobjekte ‚ Eine Virtuelle Tabllen entspricht inhaltlich der
über einen relationalen Join in Beziehung gesetzt Kombination der ursprünglichen Datenbankobjek-
werden. te.

q ‚ Die select Abfrage kann nach der Join Stufe nicht


mehr auf die Datensätze der ursprünglichen Daten-
bankobjekte zugreifen. Es wurde eine neue - Virtu-
elle Tabelle - erstellt, auf die sich die Abfrage nun
bezieht.

35
Informationssysteme

Abbildung 10. Relationale Join: Inner Join

3.3.2 Jointyp: Inner Join 3.3.3 Jointyp: Cross Join

Ein Inner Join führt die Datensätze zweier Datenban- Ein cross join führt Datensätze zweier Datenbankob-
kobjekte genau dann zusammen, wenn für die Daten- jekte zusammen, indem jeder Datensatz des ersten Ob-
sätze die angegebenen join Bedingungen erfüllt sind. jekts mit jedem Datensatz des zweiten Objekts in Be-
ziehung gesetzt wird.
 Erklärung: Join Bedingung 
 Erklärung: Cross Join 
‚ Bei der Definition eines Inner Joins werden die Da-
tenobjekte angegeben die über den Join in Bezie-
‚ Das Ergebnis eines cross joins enthält damit m*n Zei-
len wenn die eine Tabelle m und die andere Tabelle
hung gesetzt werden sollen. Gleichzeitig wird eine
n Zeilen enthält.
Bedingung formuliert, die für die Datensätze beider
Datenobjekte gelten muß.  Syntax: Cross Join 
‚ Syntaktisch wird die Join Bedingung mit dem 1 -- ----------------------------------------
Schlüsselwort on eingeleitet. 2 -- Syntax: Cross Join
3 -- ----------------------------------------
 Syntax: Inner Join  4 FROM <Table1> cross join <Table2>
1 -- ---------------------------------------- 5

2 -- Syntax: Inner Join 6 -- employees.zeile1 <-> departments.zeile1


3 -- ---------------------------------------- 7 -- employees.zeile1 <-> departments.zeile2
4 FROM <Table1> JOIN <Table2> 8 -- ... <-> ...
5 ON <Join Bedingung> 9 -- ... <-> departments.zeileN
6 10 -- employees.zeile2 <-> departments.zeile1
7 -- Beispiel: Inner Join 11 -- ... <-> ...
8 SELECT e.employee_id, e.first_name, 12 -- employees.zeileM <-> departments.zeileN
9 d.department_id, 13

10 d.department_name 14 -- Beispiel: Cross Join


11 FROM employees e join departments d 15 SELECT e.first_name, d.department_name
12 ON e.department_id = d.department_id; 16 FROM employees e cross join departments d;

q q

36
© Dipl.Ing.-Paul Panhofer Bsc.

3.3.4 Jointyp: Full Outer Join 3.3.6 Jointyp: Left-/Right Join

Der Full Outer Join entspricht einer Kombination aus Der Left Join übernimmt alle Datensätze des ur-
Left- und Rightjoin. sprünglichen Datenobjekts als Datenbasis. Alle Da-
tensätze des anderen Datenobjekts, die die angegebene
 Erklärung: Full Outer Join 
Join Bedingung erfüllen, werden dann mit der Daten-
‚ Mengentheoretisch entspricht der Full outer Join basis in Relation gesetzt.
zweier Mengen A und B der Vereinigungsmenge der
beiden Mengen. Left- und Right Join beschreiben denselben Jointyp,
wobei die Rolle der definierten Datenobjekte jeweils
‚ Der full outer join zweier Mengen ist eine kommu-
anderweitig ausgewertet werden.
tative Relation.
 Syntax: Full Outer Join   Erklärung: Left-/Right Join 
1 -- ------------------------------------------- ‚ Mengentheoretisch entspricht der left join zweier
2 -- Syntax: Full Outer Join Tabellen A und B der Menge A.
3 -- -------------------------------------------
4 FROM <Tabele1> FULL OUTER JOIN <Tabele2> ‚ Die Syntax ist dabei bis auf die Schlüsselwörter left
5 on <Bedingung> bzw. right identisch zur Syntax des Inner Join. ent-
6
gegengesetzter Richtung.
7 -- Beispiel: FULL OUTER JOIN ‚ Der left- bzw. right Join ist keine kommutative Re-
8 SELECT e.last_name, e.first_name, lation.
9 d.department_id
10 FROM employees e  Syntax: Left Join/Right Join 
11 FULL OUTER JOIN departments d 1 -- ----------------------------------------
12 ON e.department_id = u.department_id; 2 -- Syntax: Left Join
3 -- ----------------------------------------
q 4 FROM <Table1> LEFT JOIN <Table2>
5 ON <Join Bedingung>
6

7 -- Beispiel: Left Join


8 SELECT e.first_name,
9 e.last_name,
3.3.5 Jointyp: Natural Join 10 e.salary,
11 FROM employees e
Ein Natural Join ist ein ganz normaler Inner Join, al-
12 LEFT JOIN departments d
lerdings muss bei diesem Jointyp keine Joinbedingung
13 ON e.department_id = d.department_id;
angegeben werden.
14

Beim Natural Join werden die Datensätze der Da- 15

tenobjekte über alle Spalten mit demselben Namen 16 -- ----------------------------------------


in Beziehung gesetzt. 17 -- Syntax: Right Join
18 -- ----------------------------------------
 Syntax: Natural Join  19 FROM <Table1> RIGHT JOIN <Table2>
1 -- ------------------------------------------- 20 ON <Join Bedingung>
2 -- Syntax: Natural Join 21

3 -- ------------------------------------------- 22 -- Beispiel: Right Join


4 FROM <Tabele1> NATURAL JOIN <Tabele2> 23 SELECT e.first_name,
5 24 e.last_name
6 -- Beispiel: NATURAL JOIN 25 e.salary,
7 SELECT last_name, department_name 26 FROM employees e
8 FROM employees 27 RIGHT JOIN departments d
9 NATURAL JOIN departments 28 ON e.department_id = u.department_id;

q q

37
Informationssysteme

Abbildung 11. Relationale Join: Left/Right Join

. .

38
© Dipl.Ing.-Paul Panhofer Bsc.

. .

39
Informationssysteme

4. SQL - Zeilenfunktionen 4.1. Zeilenfunktionen - Grundlagen 

4.1.1 Funktionstypen

Die SQL Spezifikation definiert 2 Arten von Funktio-


nen.

 Auflistung: Arten von Funktionen 

r Zeilenfunktionen 
Zeilenfunktionen verarbeiteten die Daten ei-
nes einzelnen Datensatzes. Der Rückgabe-
wert einer Zeilenfunktion ist stets ein einzelner
Wert.

 Aggregatfunktionen 
Aggregatfunktionen verdichten mehrere Da-
tensätze zu einem einzelnen Wert.

q
01. Grundlagen: Zeilenfunktionen 40

02. Datumsfunktionen 41 4.1.2 Zeilenfunktionen

03. Textfunktionen 48 Syntaktisch gesehen haben alle Zeilenfunktionen


gemeinsam, dass sie die Daten eines einzelnen Da-
04. Numerische Funktionen 51 tensatzes, zu einem einzelnen Wert verdichten.

 Erklärung: Zeilenfunktionen 
‚ Die SQL Spezifikation definiert eine Reihe von Zei-
lenfunktionen.

1 -- --------------------------------------
2 -- Zeilenfunktionen
3 -- --------------------------------------
4 -- Die Funktion gibt das aktuelle Datum
5 -- des Datenbankservers zurueck
6 -- Da die FROM Klausel fuer eine select
7 -- Abfrage obligatorisch ist wird die
8 -- Pseudotabelle dual verwendet
9 SELECT sysdate FROM dual;
10

11 -- Funktion zum Berechnen des aktuellen


12 -- Zeitpunkts
13 SELECT systimestamp FROM dual;
14

15 -- Funktion zum Berechnen der Laenge eines


16 -- alphanumerischen Wertes
17 SELECT length(last_name) FROM employees;

40
© Dipl.Ing.-Paul Panhofer Bsc.

‚ Ein Großteil, der in der SQL Spezifikation definier- 4.2. Datumsfunktionen 


ten Zeilenfunktionen erwartet dabei Funktionspara-
meter. Datumsfunktionen werden zur Verarbeitung zeitbe-
zogener Daten verwendet.
‚ Funktionsparameter sind Werte, die einer Funktion
zur Verarbeitung mitgegeben werden.
 Auflistung: Datumsfunktionen 
1 -- -------------------------------------- 1 -- ----------------------------------------
2 -- Funktionsparameter 2 -- Datumsfunktionen
3 -- -------------------------------------- 3 -- ----------------------------------------
4 SELECT lower(ename) ergebnis FROM emp; 4 FUNCTION to_date (
5 p_time_literal IN VARCHAR2,
q 6 p_time_mask IN VARCHAR2
7 )
8 RETURN DATE;
4.1.3 Kategorien von Zeilenfunktionen 9

10 FUNCTION to_char(
Die SQL Spezifikation unterscheidet mehrere Katego-
11 p_date IN DATE,
rien von Zeilenfunktionen.
12 p_time_mask IN VARCHAR2
13 )
 Auflistung: Kategorien von Zeilenfunktionen 
14 RETURN VARCHAR2;
‚ Datumsfunktionen: Funktionen zum Bearbeiten 15
zeitbezogener Daten. 16 FUNCTION trunc (
1 -- -------------------------------------- 17 p_date IN DATE,
2 -- Datumsfunktion: to_date 18 p_mask IN VARCHAR2
3 -- -------------------------------------- 19 )
4 FUNCTION to_date ( 20 RETURN DATE;
5 p_time_literal IN VARCHAR2,
6 p_time_mask IN VARCHAR2 q
7 )
8 RETURN DATE;
4.2.1 Datumstypen vs. Zeichenketten
‚ Zeichenfunktionen: Funktionen zum Bearbeiten
von Zeichenketten. L Datumswerte 
1 -- -------------------------------------- Datumswerte werden verwendet um zeitbe-
2 -- Zeichenfunktion: instr zogene Werte in einer Datenbank abzubilden.
3 -- --------------------------------------
4 FUNCTION instr ( Die SQL Engine speichert Datumswerte dabei
5 p_content IN VARCHAR2, als die Anzahl von Millisekunden, die seit dem
6 p_token IN VARCHAR2, 01.01.1972 vergangen sind.
7 p_start_index IN INTEGER
8 )
 Erklärung: Darstellung von Datumstypen 
9 RETURN NUMBER;
‚ Bevor ein Datumswert angezeigt werden kann, muß
er durch die Datenbankengine entsprechend forma-
‚ Mathematische Funktionen: Funktionen zur Trans
tiert werden.
formation von Zahlenwerten.

‚ Konvertierungsfunktionen: Funktionen zum Kon-


‚ Durch die Angabe sogenannter Masken bestimmt
der Benutzer die Art der Formatierung für die Aus-
vertieren von Werten eines Datentyps zu einem an-
gabe eines Datumwertes.
deren Datentyp.

q q

41
Informationssysteme

4.2.2 Erzeugen eines Datums 4.2.4 Konvertieren von Datumswerten - to_date

Zum Erzeugen von Datumswerten definiert die SQL


Spezifikation 3 Möglichkeiten. Die to_date() Funktion konvertiert Zeichenketten in
Datumswerte. Die Funktion erwartet beim Aufruf 2
 Auflistung: Erzeugen eines Datums  Parameter.
 Parameter: to_date Funktion 
r Konstruktorfunktionen 
‚ p_time_literal: Der Parameter beschreibt einen
Funktionen zum direkten Erzeugen von Da- Datumswert.
tumswerten.
‚ p_time_mask: Der Parameter beschreibt eine For-
matmaske.
è Konvertierungsfunktionen 
 Syntax: to_date Funktion 
Funktionen zum Konvertieren von Zeichenket-
1 -- ----------------------------------------
ten in Datumswerte.
2 -- Syntax: to_date
3 -- ----------------------------------------
L Literale  4 FUNCTION to_date (
5 p_time_literal IN VARCHAR2,
Erzeugen von Datumswerten aus Literalen. 6 p_time_mask IN VARCHAR2
7 )
q 8 RETURN DATE;
9

10 -- Aufruf: to_date()
4.2.3 Konstrukturfunktionen
11 SELECT to_date (
Die SQL Spezifikation definiert die sysdate und 12 ’15.05.2012 17:30:56’,
systimestamp Funktionen zum Erzeugen von Datums- 13 ’dd.mm.yyyy hh24:mi:ss’
werten. 14 )
15 FROM dual;
Die sysdate und systimestamp Funktionen werden
ohne Parameter aufgerufen, und liefern als Ergebnis
q
die aktuelle Zeit des Datenbankservers.

 Query: Konstruktorfunktionen  4.2.5 Datumsliterale


1 -- ----------------------------------------
2 -- Konstruktorfunktionen Datumswerte selbst, können ebenfalls aus einem Li-
3 -- ---------------------------------------- teral generiert werden. Ein Datumsliteral muß dabei
4 -- Generieren eines Date Datumswertes. Es dem ISO Datumsformat entsprechend aufgebaut sein.
5 -- wird das aktuelle Datum ausgegeben.
 Query: Datumsliterale 
6 SELECT sysdate FROM dual;
7 1 -- ----------------------------------------
8 -- Ausgabe: 2018-10-30 18:18:27 2 -- Literale
9 3 -- ----------------------------------------
10 4 -- Literal: yyyy-mm-dd
11 -- Generieren eines Timestamp Datumswertes. 5 SELECT date ’2012-05-15’ datum
12 -- Es wird das aktuelle Datum ausgegeben. 6 FROM dual;
13 SELECT systimestamp FROM dual; 7

14 8 -- Literal: yyyy-mm-dd hh24:mi:ss


15 -- Ausgabe: 9 SELECT timestamp ’2012-05-15 15:00:00’ datum
16 -- 2018-10-30 18:18:27.590954 +01:00 10 FROM dual;

q q

42
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 12. Erzeugen von Datumdatenwerten

4.2.6 Datumswerte umwandeln - to_char() 4.2.7 Rundungsfunktionen - trunc(), round()

Die to_char() Funktion konvertiert Datumswerte in Die SQL Spezifikation definiert 2 Funktionen zum Run-
Zeichenketten. den von Datumswerten: trunc() und round().

 Parameter: to_char Funktion  Die round und trunc Funktionen unterscheiden sich
‚ p_date: Der Parameter beschreibt einen Datums- ausschließlich in ihrem Rundungsverhalten. Beide
wert. Funktionen arbeiten mit denselben Parametern.

‚ p_time_mask: Der Parameter beschreibt eine For-


matmaske zur Formatierung eines Datumswertes.  Erklärung: trunc, round Funktion 
‚ Die trunc() Funktion wird verwendet um Datums-
 Syntax: to_char Funktion  werte zu runden.
1 -- ----------------------------------------
2 -- Syntax: to_char
‚ Das Rundungsverhalten der Funktionen wird dabei
über Parameterwerte gesteuert.
3 -- ----------------------------------------
4 FUNCTION to_char( ‚ Kein Rundungsparameter: Das Datum wird
5 p_date IN DATE, auf ’00:00:00’ gesetzt.
6 p_time_mask IN VARCHAR2 ‚ MM: Das Datum wird auf den 1.ten des Monats
7 ) gerundet.
8 RETURN VARCHAR2; ‚ Q: Das Datum wird auf das Quartal zurückge-
9 setzt in das das Datum fällt.
10 -- ---------------------------------------- ‚ Y: Das Datum wird auf den 1ten Tag des Jahres
11 -- Datumswerte umwandeln gerundet.
12 -- ----------------------------------------
13 SELECT to_char( hiredate, ’dd.mm.yyyy’) ‚ Die round und trunc Funktion sind bis auf ihr Run-
hiredate dungsverhalten identisch. Die round Funktion run-
14 FROM employees det im Gegensatz zur trunc Funktion kaufmännisch.
15 where employee_id = 7839;
16

17 -- Ausgabe: 10.09.2008

43
Informationssysteme

Funktion Beschreibung Seite

add_months() Die add_months Funktion arbeitet analog zur Datumsarithmetik und erlaubt die Additi- 46
on von Monaten zu einem Datumswert.
extract() Die extract Funktion erlaubt die Extraktion bestimmter Teile aus einem Datum. 46
last_day() Die last_day Funktion berechnet den letzten Tag des Monats in den das Datum fällt. 46
months_between() Die months_between Funktion berechnet die Differenz zweier Datumswerte. Der Wert 47
wird dabei auf Monate gerundet. Dabei werden Schaltjahre und Monatslängen
berücksichtigt.
next_day() Die next_day Funktion berechnet für ein gegebenes Datum das Datum des nachfol- 47
genden Tages.
to_char() Die to_char() Funktion konvertiert eine Datumsangaben in eine Zeichenketten. 43

Abbildung 13. Datumsfunktionen

 Syntax: trunc, round Funktion  4.2.8 Erzeugen von Intervallen


1 -- ----------------------------------------
Die SQL Spezifikation erlaubt neben dem Verarbeiten
2 -- Syntax: trunc(), round()
von Datumswerten auch das Arbeiten mit Zeitinter-
3 -- ----------------------------------------
vallen.
4 FUNCTION trunc (
5 p_date IN DATE,  Erklärung: Erzeugen von Intervallen 
6 p_mask IN VARCHAR2 DEFAULT ’’ ‚ Die SQL Spezifikation erlaubt neben der Berechnung
7 ) von Zeitangaben auch das Arbeiten mit Zeitinterval-
8 RETURN DATE; len.
9

10 FUNCTION round ( ‚ Zeitintervalle werden durch die Angabe von Lite-


11 p_date IN DATE, ralen definiert.
12 p_mask IN VARCHAR2 DEFAULT ’’
13 )  Query: Erzeugen von Intervallen 
14 RETURN DATE; 1 -- ----------------------------------------
15 2 -- Erzeugen von Intervallen
16 -- ---------------------------------------- 3 -- ----------------------------------------
17 -- trunc Funktion 4 SELECT interval ’3’ year Jahre,
18 -- ---------------------------------------- 5 interval ’32’ month Monate,
19 SELECT 6 interval ’64’ day Tage,
20 trunc(to_date(’12.05.2017’)) hiredate, 7 interval ’36’ hour Stunden,
21 trunc(to_date(’12.05.2017’), ’MM’) month, 8 interval ’105’ minute Minuten,
22 trunc(to_date(’12.05.2017’), ’Q’) quarter, 9 interval ’635’ second Sekunden
23 trunc(to_date(’12.05.2017’), ’Y’) year 10 FROM dual;
24 FROM dual; 11

25 12 -- Ausgabe
26 13 3-0 -- Jahre
27 -- Ausgabe 14 1-0 -- Monate
28 12.05.2017 00:00:00 -- hiredate 15 64 0:0:0.0 -- Tage
29 01.05.2017 00:00:00 -- month 16 1 12:0:0.0 -- Stunden
30 01.04.2017 00:00:00 -- quarter 17 0 1:45:0.0 -- Minuten
31 01.01.2017 00:00:00 -- year 18 0 0:10:35.0 -- Sekunden

q q

44
© Dipl.Ing.-Paul Panhofer Bsc.

Intervall Beschreibung Seite

year to month Das Literal repräsentiert ein Zeitintervall aus Jahren und Monaten.
day to minute Das Literal repräsentiert ein Zeitintervall. Der Wert beschreibt ein Zeitintervall von Tagen,
Stunden und Minuten.
day to second Das Literal repräsentiert ein Zeitintervall. Der Wert beschreibt ein Zeitintervall von Tagen,
Stunden, Minuten und Sekunden.

Abbildung 14. Datumsfunktionen

4.2.9 Geschachtelte Intervalle darstellt mit einem Ganzzahlanteil, der die Anzahl
der Tage seit einem Startdatum wiedergibt, und einen
Die SQL Spezifikation erlaubt die Definition geschach- Nachkommaanteil, der den Anteil des Tages benennt,
telter Intervalle. Die Intervalle werden als Literale de- der bereits vergangen ist.
finiert.
 Erklärung: Datumsarithmetik 
‚ Die SQL Spezifikation erlaubt das Rechnen mit
Datumswerten. Durch die Angabe von Intervallen
können einfache Berechnungen mit Datumswerten
durchgeführt werden.
‚ Dabei kümmert sich die Datenbankengine um Fin-
digkeiten wie wieviele Tage ein bestimmtes Monat
hat oder ob ein Jahr ein Schaltjahr ist.
‚ Die Datumsarithmetik unterstütz dabei die Additi-
on bzw. die Subtraktion von Datumswerten ausge-
hend von einem bestimmten Zeitpunkt.
 Query: Geschachtelten Intervallen 
‚ Die Addition ist dabei eine arithmetische Operati-
1 -- ----------------------------------------
on auf einem Datumswert und einem Zeitintervall.
2 -- Geschachtelte Intervalle
3 -- ---------------------------------------- ‚ Die Subtraktion ist die einzige sinnvolle direkte
4 SELECT arithmetische Operation auf 2 Datumswerten.
5 interval ’2-11’ year to month intervall_1,
‚ Im Fall der Subtraktion des Datentyps date ist
6 interval ’4 3:30’ day to minute intervall_2,
das Ergebnis eine Zahl.
7 interval
8 ’4 3:30:45’ day to second intervall_3 ‚ Im Fall der Subtraktion des Datentyps timestamp
9 FROM dual; ein Interval.
10
 Query: Datumsarithmetik 
11 -- Ausgabe
1 -- ----------------------------------------
12 2-11 -- intervall_1
2 -- Datumsarithmetik
13 3:30:0.0 -- intervall_2
3 -- ----------------------------------------
14 3:30:45.0 -- intervall_3
4 SELECT trunc(sysdate)
5 + interval ’3’ month
q 6 + interval ’1’ day
7 + interval ’1’ day
8 + interval ’2 15:20’ day to minute
4.2.10 Datumsarithmetik
9 FROM dual;
Das Rechnen mit Datumswerten ist dann leicht, wenn
wir uns vergegenwärtigen, daß ein Datum eine Zahl q

45
Informationssysteme

4.2.11 Datumsfunktion: add_months() 4.2.13 Datumsfunktion: extract()

Die add_months() Funktion arbeitet analog zur Da- Die extract() Funktion ermöglicht die Extraktion be-
tumsarithmetik und erlaubt die Addition von Mona- stimmter Teile eines Datumswertes.
ten zu einem Datumswert.
 Syntax: extract Funktion 
 Parameter: add_months Funktion  1 -- ----------------------------------------
‚ Die Funktion erwartet 2 Parameter. add_months 2 -- Syntax: extract
arbeitet mit Datenwerten vom Typ Date bzw. 3 -- ----------------------------------------
Timestamp und liefert als Ergebnis jedoch immer 4 FUNCTION extract (
einen Wert vom Typ Date zurück. 5 p_param IN EXPR
6 )
‚ Ein negativer Wert der Monatsangabe subtrahiert 7 RETURN INTEGER;
die entsprechende Anzahl von Monaten. 8

9 -- ----------------------------------------
 Syntax: add_months Funktion  10 -- Datumsfunktion: extract
1 -- ---------------------------------------- 11 -- ----------------------------------------
2 -- Syntax: add_months 12 SELECT extract(year from sysdate) year,
3 -- ---------------------------------------- 13 extract(month from sysdate) month,
4 FUNCTION add_months ( 14 extract(day from sysdate) day
5 p_date IN DATE, 15 FROM dual;
16
6 p_month_amount IN INTEGER
7 ) 17 2017 -- year
8 RETURN DATE; 18 7 -- month
9
19 30 -- day
10 -- ----------------------------------------
11 -- Aufruf add_months q
12 -- ----------------------------------------
13 SELECT add_months(trunc(sysdate), 3)
4.2.14 Datumsfunktion: last_day()
14 FROM dual;
Die last_day() Funktion berechnet den letzten Tag
des Monats in den der angegebene Datumswert fällt.
q

4.2.12 Datumsfunktion: next_day()  Syntax: last_day Funktion 


1 -- ----------------------------------------
Die next_day() Funktion berechnet für ein gegebenes 2 -- Syntax: last_day
Datum das Datum des nachfolgenden Tages. 3 -- ----------------------------------------
4 FUNCTION last_day (
 Syntax: next_day Funktion  5 p_date IN DATE
1 -- ---------------------------------------- 6 )
2 -- Syntax: next_day 7 RETURN DATE;
3 -- ---------------------------------------- 8

4 FUNCTION next_day ( 9 -- ----------------------------------------


5 p_date IN DATE, 10 -- Datumsfunktion: last_day
6 p_day IN VARCHAR2 11 -- ----------------------------------------
7 ) 12 SELECT last_day(sysdate) date_1,
8 RETURN DATE_EXP; 13 extract(day from last_day(sysdate)) date_2
9 14 FROM dual;
10 SELECT next_day(sysdate, ’Freitag’) 15

11 FROM dual; 16 31.7.2017 15:11:24 -- date_1


17 31 -- date_2

q
q

46
© Dipl.Ing.-Paul Panhofer Bsc.

4.2.15 Datumsfunktion: next_day() .

Die next_day() Funktion berechnet für ein gegebenes


Datum, das Datum des nachfolgenden Tages.

 Syntax: next_day Funktion 


1 -- ----------------------------------------
2 -- Syntax: next_day
3 -- ----------------------------------------
4 FUNCTION next_day (
5 p_date_1 IN DATE,
6 p_day IN VARCHAR2
7 )
8 RETURN DATE_EXP;
9

10 -- Aufruf
11 SELECT next_day(sysdate, ’Freitag’)
12 FROM dual;

4.2.16 Datumsfunktion: months_between()

Die months_between() Funktion berechnet wieviele


Monate zwischen 2 Datumswerten liegen. Dabei wer-
den Schaltjahre und Monatslängen berücksichtigt.

 Parameter: months_between Funktion 


‚ Als Parameter erwartet die Funktion zwei Datums-
angaben, wobei das spätere Datum als erstes über-
geben werden sollte.

‚ Die Funktion eignet sich in erster Linie zur Berech-


nung von Zeitdauern.

 Syntax: months_between Funktion 


1 -- ----------------------------------------
2 -- Syntax: months_between
3 -- ----------------------------------------
4 FUNCTION months_between (
5 p_date_1 IN DATE,
6 p_date_2 IN DATE
7 )
8 RETURN DATE_EXP;
9

10 -- Aufruf
11 SELECT trunc(
12 months_between( sysdate, hiredat )
13 )
14 FROM employees;

47
Informationssysteme

4.3. Textfunktionen  4.3.2 Textfunktionen: trim()

Die SQL Spezifikation definiert eine Zahl von Funktio- Die trim() Funktion wird verwendet um Token am
nen zur Verarbeitung von Zeichenketten. Ende bzw. am Anfang einer Zeichenkette zu entfernen.
Die SQL Spezifikation definiert mehrere Formen der
trim() Funktion.
4.3.1 Textfunktion: instr()
 Syntax: trim(), ltrim(), rtrim() 
Die instr() Funktion prüft, ob ein Token in einer Zei- 1 -- ---------------------------------------
chenkette enthalten ist und gibt die Position bei einer 2 -- Syntax: trim, ltrim, rtrim
Übereinstimmung zurück. 3 -- ---------------------------------------
4 FUNCTION ...trim... (
 Parameter: instr() Funktion  5 p_text IN VARCHAR2,
‚ p_content: Der Parameter beschreibt die zu durch- 6 p_token IN VARCHAR2
suchende Zeichenkette. 7 )
8 RETURN VARCHAR2;
‚ p_token: Der Parameter beschreibt den Token nach 9
dem gesucht wird. 10 -- ----------------------------------------
‚ p_start_index: Der Paramter beschreibt die Posi- 11 -- Textfunktion: lefttrim, righttrim
tion ab der die Zeichenkette durchsucht werden soll. 12 -- ----------------------------------------
Der Parameter ist optional und ist defaultmäßig mit 13 SELECT ltrim(’<Das ist ein Element/>’,’<’)
dem Wert 1 initialisiert. 14 FROM dual;
15
‚ p_count: Der Parameter definiert welches Vorkom- 16 -- Ausgabe
men des Tokens ermittelt werden soll. Der Parame- 17 Das ist ein Element/>
ter ist optional und ist defaultmäßig mit dem Wert 18
1 initialisiert. 19 -- rtrim
20 SELECT rtrim(’<Das ist ein Element/>’, ’/>’)
 Syntax: instr Funktion 
21 FROM dual;
1 -- ---------------------------------------- 22
2 -- Syntax: instr 23 -- Ausgabe
3 -- ---------------------------------------- 24 <Das ist ein Element
4 FUNCTION instr ( 25
5 p_content IN VARCHAR2, 26 -- ----------------------------------------
6 p_token IN VARCHAR2, 27 -- Textfunktion: trim
7 p_start_index IN INTEGER DEFAULT 1, 28 -- ----------------------------------------
8 p_count IN INTEGER DEFAULT 1 29 SELECT
9 ) 30 trim(both ’.’ from ’...SMITH...’) text_1,
10 RETURN NUMBER; 31 trim(leading ’.’ from ’...SMITH...’) text_2,
11
32 trim(trailing ’.’ from ’...SMITH...’) text_3
12 -- ---------------------------------------- 33 FROM dual;
13 -- Textfunktion: instr 34
14 -- ---------------------------------------- 35 -- Ausgabe
15 SELECT 36 SMITH -- text_1
16 instr(’/home/foo.txt’, ’/’) pos_1, 37 SMITH... -- text_2
17 instr(’/home/foo.txt’, ’/’, 1, 2) pos_2 38 ...SMITH -- text_3
18 FROM dual; 39
19
40 SELECT trim(’ SMITH ’) FROM dual;
20 -- Ausgabe 41
21 1 -- pos_1 42 -- Ausgabe
22 6 -- pos_2 43 SMITH

q
q

48
© Dipl.Ing.-Paul Panhofer Bsc.

Funktion Beschreibung Seite

instr() Die instr() Funktion prüft, ob ein Token in einer Zeichenkette enthalten ist und gibt die Position 48
bei einer Übereinstimmung an.
length() Mit der length Funktion wird die Länge einer Zeichenkette berechnet. Der Rückgabewert ist 49
dabei als die Anzahl von bytes bzw. die Anzahl von Zeichen zu lesen.
lower() Mit der lower() und upper() Funktion werden Zeichenfolgen transformiert. 50
replace() Mit der replace Funktion wird eine Zeichenkette in einem Text durch eine andere Zeichenkette 50
ersetzt.
soundex() Die soundex Funktion führt einen Vergleich zwischen Zeichenketten durch. Der Vergleich be- 49
wertet die phonetische Änlichkeit von Zeichenketten.
substr() Die substr Funktion wird verwendet um aus einer Zeichenkette einen Teilstring zu extrahieren. 50
trim() Mit den unterschiedlichen Formen der trim Funktion werden am Ende bzw. Anfang einer Zei- 48
chekette Zeichenfolgen entfernt.
upper() Mit der lower() und upper() Funktion werden Zeichenfolgen transformiert. 50

Abbildung 15. Textfunktionen

4.3.3 Textfunktion: length() 4.3.4 Textfunktion: soundex()

Mit Hilfe der length() Funktion wird die Länge einer Mit der soundex() Funktion wird die phonetische
Zeichenkette bestimmt. Der Rückgabewert kann dabei Kennzahl einer Zeichenkette bestimmt werden.
in Form von bytes bzw. als Anzahl von Zeichen ausge-
geben werden.  Syntax: soundex Funktion 
1 -- ----------------------------------------
 Syntax: length Funktion  2 -- Syntax: soundex
1 -- ---------------------------------------- 3 -- ----------------------------------------
2 -- Syntax: length 4 FUNCTION soundex (
3 -- ---------------------------------------- 5 p_text IN VARCHAR2
4 FUNCTION length ( 6 )
5 p_text IN VARCHAR2 7 RETURN VARCHAR2;
8
6 )
9
7 RETURN INTEGER;
8
10 -- ----------------------------------------
9 -- ---------------------------------------- 11 -- Textfunktion: soundex
10 -- Textfunktion: length 12 -- ----------------------------------------
11 -- ---------------------------------------- 13 SELECT last_name, job_id
12 SELECT 14 FROM employees
13 length (’Toromtomtom’) zeichen, 15 WHERE soundex_ger(last_name) in (
14 lengthb(’Toromtomtom’) byte 16 soundex_ger(’Meier’),
15 FROM dual; 17 soundex_ger(’Mayer’),
16
18 soundex_ger(’Meyer’),
17 -- Ausgabe 19 soundex_ger(’Mair’),
18 11 -- zeichen 20 soundex_ger(’Maier’),
19 15 -- byte 21 soundex_ger(’Mayr’),
22 soundex_ger(’Meir’)
23 );
q

49
Informationssysteme

4.3.5 Textfunktionen: lower(), upper() 1 -- ----------------------------------------


2 -- replace ohne Ersatzzeichen
Mit der lower() bzw. upper() Funktion können Zeichen-
3 -- ----------------------------------------
ketten transformiert werden.
4 SELECT replace(’SALEMAN’, ’MAN’)
5 FROM dual;
 Syntax: lower(), upper(), initcap() 
6
1 -- ---------------------------------------- 7 -- Ausgabe
2 -- Syntax: lower, upper 8 SALE
3 -- ----------------------------------------
4 FUNCTION lower ( q
5 p_text IN VARCHAR2
6 )
4.3.7 Textfunktion: substr()
7 RETURN VARCHAR2;
8 Die substr Funktion wird verwendet um aus einer Zei-
9 -- ---------------------------------------- chenkette einen Teilstring zu extrahieren.
10 -- Textfunktion: lower, upper
11 -- ----------------------------------------  Parameter: substr Funktion 
12 SELECT lower(last_name) lower, ‚ Die substr() Funktion erwartet 3 Parameter:
13 upper(last_name) upper, p_text, p_begin und p_length.
14 initcap (last_name) initcap
‚ Der p_length Parameter ist optional. Wird er weg-
15 FROM employees
gelassen, wird der String bis zum Ende der Zeichen-
16 WHERE lower(last_name) = lower(’Miller’);
kette extrahiert.
17

18 -- Ausgabe  Syntax: substr Funktion 


19 miller -- lower 1 -- ----------------------------------------
20 MILLER -- upper 2 -- Syntax: substr
21 Miller -- initcap 3 -- ----------------------------------------
4 FUNCTION substr(
q
5 p_text IN VARCHAR2,
6 p_begin IN INTEGER,
7 p_length IN INTEGER DEFALUT length(p_text)
4.3.6 Textfunktion: replace() 8 )
9 RETURN VARCHAR2;
Mit der replace() Funktion wird ein Token in einem
10
Text durch einen anderen Token ersetzt. Das gilt für je-
11 -- ----------------------------------------
des Vorkommen der Zeichenkette im Text. Der Token,
12 -- Textfunktion: substr
der als Ersatzzeichen angegeben werden kann ist optio-
13 -- ----------------------------------------
nal. Wird er nicht angegeben wird der Token lediglich
14 SELECT substr(’Das ist ein Text’, 9, 3)
aus dem Text entfernt.
15 FROM dual;
16
 Query: replace Funktion 
17 -- Ausgabe
1 -- ---------------------------------------- 18 ein
2 -- Textfunktion: replace 19
3 -- ---------------------------------------- 20 -- ----------------------------------------
4 SELECT replace( 21 -- substr ohne 3ten Parameter
5 ’Katalog 2014: ICD_2014’, ’2014’, ’2015’ 22 -- ----------------------------------------
6 ) 23 SELECT substr(’Das ist ein Text’, 9)
7 FROM dual; 24 FROM dual;
8
25
9 -- Ausgabe 26 -- Ausgabe
10 Katalog 2015: ICD_2015 27 ein Text

50
© Dipl.Ing.-Paul Panhofer Bsc.

Element Bemerkung Beispiel

G Liefert den Tausendertrenner. Im deutschen Sprachraum wird das Komma verwendet. 9G999G999
,(Komma) Wird als Tausendertrenner nach amerikaischem Standard verwendet und kann mehr- 9,999,999
fach vorhanden sein, allerdings weder als erstes Zeichen noch rechts vom Dezimalt-
renner bzw. Punkt.
D Liefert das Dezimaltrennzeichen. Im deutschen Sprachraum ist das ein . 9G999D00
.(Punkt) Wird als Dezimaltrenner nach amerikanischem Standard verwendet und darf daher 9,999.00
nur einmal vorkommen.
C Liefert das ISO Währungssymbol an der angegebenen Stelle C9G990D00

$ Liefert die Zahl mit einem führenden Dollarzeichen $9,990.00


9 Optionale Ziffer. Ist die Ziffer dieser Position nicht vorhanden, wird sie nicht 9,99
ausgegeben.
0 Verpflichtend auszugebende Ziffer. Ist die Ziffer dieser Position nicht vorhanden, wird 0.00
eine 0 ausgegeben.
FM Entfernt Leerzeichen aus der Zeichenkette. FM99G999
FM Entfernt Leerzeichen aus der Zeichenkette. FM99G999
FM Entfernt Leerzeichen aus der Zeichenkette. FM99G999
B Lierfert Leerzeichen falls die Ziffern des Ganzzahlanteils nicht vorhanden sind. BS99G999

Abbildung 16. Formatoption für numerische Konvertierungsfunktionen

4.4. Numerische Funktionen   Syntax: round Funktion 


1 -- ----------------------------------------
Numerische Funktionen werden zur Verarbeitung nu- 2 -- Syntax: round
merischer Werte in SQL verwendet. 3 -- ----------------------------------------
4 FUNCTION round (
4.4.1 Rundungsfunktionen 5 p_number IN NUMBER,
6 p_round IN PLS_INTEGER
Zum Runden numerischer Werte stellt die SQL Spezi- 7 )
fikation 2 Funktionen zur Verfügung: trunc und round. 8 RETURN VARCHAR2;
9

 Analyse: Rundungsfunktionen  10 SELECT round(12345.678) n_1,


‚ Mit der trunc Funktion werden numerische Werte 11 round(12345.678, 1) n_2,
abgerundet, während round nach kaufmänischem 12 round(12345.678, 2) n_3,
Verfahren auf- bzw. abrundet. 13 round(12345.678, -2) n_6,
14 FROM dual;
‚ Der 2te Parameter spezifiziert die Genauigkeit des 15
Rundungsvorgangs. Dazu wird die Anzahl der Nach- 16 -- Ausgabe
kommastellen angegeben. 17 12346 -- n_1
‚ Zusätzlich kann für den 2ten Parameter ein neagit- 18 12345.7 -- n_2
ver Wert übergeben werden, wodurch die Funktion 19 12345.68 -- n_3
auf ganze Zehner, Hunderter bzw. Tausender etc. 20 12300 -- n_6
rundet.

51
Informationssysteme

 Syntax: trunc Funktion   Query: to_number Funktion 


1 -- ---------------------------------------- 1 -- ----------------------------------------
2 -- Syntax: trunc 2 -- Syntax: to_number
3 -- ---------------------------------------- 3 -- ----------------------------------------
4 FUNCTION trunc ( 4 FUNCTION to_number (
5 p_number IN NUMBER, 5 p_number_literal IN VARCHAR2,
6 p_round IN PLS_INTEGER 6 p_mask IN VARCHAR2
7 ) 7 )
8 RETURN VARCHAR2; 8 RETURN NUMBER;
9 9

10 -- ---------------------------------------- 10 -- ----------------------------------------
11 -- Syntax: trunc 11 -- Konvertierungsfunktion: to_number
12 -- ---------------------------------------- 12 -- ----------------------------------------
13 SELECT trunc(12345.678) n_1, 13 SELECT
14 trunc(12345.678, 1) n_2, 14 to_number(’12345’) n_1,
15 trunc(12345.678, 2) n_3, 15 to_number(’123,45’) n_2,
16 trunc(12345.678, -2) n_6, 16 to_number(’123.45,21’, ’999G99D99’) n_3,
17 trunc(12345.678, -1) n_7 17 FROM dual;
18 FROM dual; 18

19 19

20 20 -- Ausgabe
21 -- Ausgabe 21 12345 -- n_1
22 12345 -- n_1 22 123.45 -- n_2
23 12345.6 -- n_2 23 12345.45 -- n_3
24 12345.67 -- n_3
25 12300 -- n_6
q
26 12340 -- n_7

q 4.4.3 Numerische Funktion: abs()

Die abs Funktion gibt den absoluten Wert einer Zahl


4.4.2 Konvertierungsfunktionen zurück.
 Query: abs Funktion 
Zum Konvertieren numerischer Wert in Zeichenketten
wird die to_char Funktion verwendet. Dazu werden 1 -- ----------------------------------------
durch den User Formatmasken definiert. 2 -- Syntax: abs
3 -- ----------------------------------------
 Query: to_char Funktion  4 FUNCTION abs (
1 -- ---------------------------------------- 5 p_value IN Number
2 -- Konvertierungsfunktion: to_char 6 )
3 -- ---------------------------------------- 7 RETURN NUMBER;
8
4 SELECT
5 to_char(123456.89, ’999G999D99’) s_1, 9 -- ----------------------------------------
6 to_char(12345.67, ’999G999D99’) s_2, 10 -- Example: abs
7 to_char(12345.67, ’999G999D99C’) s_3 11 -- ----------------------------------------
8 FROM dual; 12 SELECT
9
13 abs(-4) n_1, abs( 4) n_2
10
14 FROM dual;
15
11 -- Ausgabe
12 123.456,12 -- s_1 16 4 -- n_1
13 12.345,67 -- s_2 17 4 -- n_2
14 12.345,67EUR -- s_3
q

52
© Dipl.Ing.-Paul Panhofer Bsc.

Funktion Beschreibung Seite

round(), trunc() Funktionen zum Runden numerischer Werte 51


to_char() Funktion zum Konvertieren numerischer Werte in Zeichenketten. 52
to_number() Funktion zum Konvertieren von Zeichenketten in numerische Werte. 52
abs() Die abs Funktion gibt den absoluten Wert einer Zahl zurück 52
mod() Die mod Funktion gibt den Rest von m geteilt durch n als Ergebis zurück. 53
exp() Die exp Funktion berechnet die mathematische Exponentialfunktion für einen numerischen 53
Wert.
log() Die log Funktion gibt den Logarithmus von n zur Basis m zurück. 53

Abbildung 17. Numerische Funktionen

4.4.4 Numerische Funktion: exp(), log() 4.4.5 Numerische Funktion: mod()

Die exp Funktion berechnet die mathematische Expo- Die mod Funktion gibt den Rest von m geteilt durch n
nentialfunktion für einen numerischen Wert. Die log als Ergebis zurück.
Funktion gibt den Logarithmus von n zur Basis m zu-
 Query: mod Funktion 
rück.
1 -- ----------------------------------------
 Query: exp, log Funktion  2 -- Syntax: mod
1 -- ---------------------------------------- 3 -- ----------------------------------------
2 -- Syntax: exp, log 4 FUNCTION mod (
3 -- ---------------------------------------- 5 p_m IN Number,
4 FUNCTION exp ( 6 p_n IN Number
5 p_m IN Number 7 )
6 ) 8 RETURN NUMBER;
7 RETURN NUMBER; 9

8 10 -- ----------------------------------------
9 FUNCTION log ( 11 -- Example: mod
10 p_n IN Number, 12 -- ----------------------------------------
11 p_m IN Number 13 SELECT
12 ) 14 mod(15, 4) n_1,
13 RETURN NUMBER; 15 mod(15, 3) n_2,
14 16 mod(15, 0) n_3,
15 -- ---------------------------------------- 17 mod(11.6, 2) n_4,
16 -- Example: exp, log 18 mod(-15, 4) n_5,
17 -- ---------------------------------------- 19 mod(-15, 0) n_6,
18 SELECT 20 FROM dual;
19 exp(3) n_1, 21

20 log(10, 20) n_2, 22 -- Ergebnis


21 log(100, 1) n_3 23 3 -- n_1
22 FROM dual; 24 0 -- n_2
23 25 15 -- n_3
24 -- Ergebnis 26 1.1 -- n_4
25 20.0855369 -- n_1 27 -3 -- n_5
26 1.30203999 -- n_2 28 -15 -- n_6

q q

53
Informationssysteme

5. SQL - Aggregatfunktionen 5.1. Aggregatfunktionen 

Funktionen, die eine Menge von Werten zu einem


einzelnen Wert verdichten, werden als Aggregat-
funktionen bezeichnet.

L Aggregation 
Aggregation bezeichnet das Zusammenfas-
sen einer Reihe von Fakten zu einem einzelnen
Wert.

Beispielsweise läßt sich aus einer Menge von


Zahlen der Mittelwert, das Minimum bzw das
Maximum oder die Summe der Werte bestim-
men.

5.1.1 Aggregatfunktionen

Im Gegensatz zu einer Zeilenfunktion, die für einen


01. Aggregatfunktionen 54 Datensatz einen einzelnen Wert berechnet, verdichtet
eine Aggregatfunktion mehrere Datensätze zu einem
02. Group By Klausel 56 einzelnen Wert.

 Erklärung: Einfache Aggregatfunktionen 


‚ Die SQL Spezifikation definiert eine Reihe von Ag-
gregatfunktionen: avg, max, min, sum und count.
‚ Aggregatfunktionen werden in der Regel in Kombi-
nation mit der group by Klausel verwendet.

1 -- --------------------------------------
2 -- Aggregatfunktionen
3 -- --------------------------------------
4 -- Berechnet die Anzahl aller Angestellen
5 SELECT count(employee_id) FROM employees;
6

7 -- Berechnet das kleinste Gehalt das im


8 -- Unternehmen ausbezahlt wird
9 SELECT min(SALARY) FROM employees;
10

11 -- Berechnet das hoechste Gehalt das im


12 -- Unternehmen ausbezahlt wird
13 SELECT max(SALARY) FROM employees;
14

15 -- Berechnet das Durchschnittsgehalt


16 -- das im Unternehmen ausbezahlt wird
17 SELECT avg(SALARY) FROM employees;

54
© Dipl.Ing.-Paul Panhofer Bsc.

5.1.2 Median 5.1.4 Aggregatfunktionen und NULL Werte

Bei der Verdichtung von Datensätzen zu einem einzel-


L Median  nen Wert werden null Werte ignoriert.
Der Median oder Zentralwert ist einer der sta-
Damit können Aggregatfunktionen auch auf Spalten
tistischen Mittelwerte.
angewandt werden die null Werte enthalten.
Zur Berechnung des Medians einer Menge von Zah-
 Query: Aggregatfunktionen und NULL Werte 
len, werden die Werte zunächst sortiert und dann
der mittlere dieser Werte gewählt. 1 -- ----------------------------------------
2 -- Aggregatfunktionen und NULL Werte
 Query: Median berechnen  3 -- ----------------------------------------
4 SELECT avg(salary), max(salary)
1 -- ----------------------------------------
5 FROM employees;
2 -- Median
3 -- ----------------------------------------
4 SELECT q
5 median(coalesce(salary, 0)) MEDIAN
6 FROM employees;
5.1.5 UNIQUE Operator

q Für Aggregatfunktionen muß entschieden werden ob


alle oder nur alle unterschiedlichen Werte einer Spal-
te für die Berechnung eines Ergebnisses herangezogen
5.1.3 Standardabweichung werden sollen.

L Standardabweichung   Erklärung: Werte einer Spalte zählen 


‚ Durch die Verwendung des distinct Schlüsselworts
Die Standardabweichung einer Menge gibt
in der select Klausel, wird die Datenbankengine an-
an wie stark die Werte dieser Menge von de-
gehalten, alle redundanten Datensätze aus dem Ab-
ren Mittelwert abweichen.
frageergebnis zu entfernen.
Die Standardabweichung ist ein Streuungswert der ‚ Da die group Klausel jedoch vor der select Klausel
Statistik. ausgewertet wird, hat die Verwendung des distinct
Schlüsselworts keinen Auswirkung auf den Datenbe-
 Erklärung: Standardabweichung 
stand der group Klausel.
‚ Bei einer Menge von Zahlen, die um den Mittelwert
herum angeordnet sind, ist es oft von Interesse, wie 1 -- --------------------------------------
nahe diese Werte am Mittelwert bleiben. 2 -- distinct operator
3 -- --------------------------------------
‚ Als Mittelwert wird in diesem Zusammenhang das 4 SELECT count(distinct job) berufe
arithmetische Mittel verwendet. 5 FROM emp;
‚ Bleiben die Werte dicht am Mittelwert, ist die
Streuung der Datenwerte gering. ‚ Sollen nur die unterschiedlichen Werte einer Spalte
für die Auswertung einer Aggregatfunktion heran-
‚ Der Abstand der Werte vom Mittelwert, wird als
gezogen werden muß das unique Schlüsselwort ver-
Quadrat der Differenz der Einzelwerte berechnet.
wendet werden.
1 -- --------------------------------------
1 -- --------------------------------------
2 -- Standardverteilung
2 -- unique operator
3 -- --------------------------------------
3 -- --------------------------------------
4 SELECT stdev(salary)
4 SELECT count(unique job) berufe
5 FROM employees;
5 FROM emp;

q
q

55
Informationssysteme

5.2. Group by Klausel  5.2.2 Group by Klausel

Mit der group by Klausel kann eine Neustrukturierung


Die group by Klausel führt eine Neustrukturierung
der Daten einer Abfrage durchgeführt werden.
der Daten einer Abfrage durch.
 Erklärung: Neustrukturierung von Daten 
Bislang ist es zwar ganz interessant, das höchste Gehalt
bzw. das Durchschnittsgehalt aller Angestellten im Un-
‚ Die durch die group by Klausel angestossene Neu-
strukturierung der Daten einer Abfrage erfolgt in 2
ternehmen zu berechnen, vielmehr würde uns aber der
Schritten: der Map Phase und der Aggregate Pha-
Vergleich der Gehälter der einzelnen Abteilungen des
se.
Unternehmens interessieren.
‚ Map Phase: In der Map Phase werden die Daten
der Datenbasis auf disjunkte Gruppen verteilt.
5.2.1 Neustrukturierung von Daten
‚ Aggregate Phase: In der Aggregate Phase werden
die Daten jeder Gruppe zu einm einzelnen Datensatz
L Group by Klausel 
verdichtet. Die Menge aller so bestimmten Datensät-
Die group by Klausel führt eine Neustrukturie- ze wird zur Datenbasis der Abfrage. Die Struktur
rung der Daten einer Abfrage durch. des Datenbestandes wurde damit einer Neustruktu-
rierung unterzogen.

 Erklärung: Ausführungsreihenfolge der Klauseln  ‚ Nach dem Abschluss der Aggregate Phase ist die
Neustrukturierung der Daten abgeschlossen.

select Anweisung q

from where group by select order by


5.2.3 Map Phase

having case offset L Map Phase 


In der Map Phase werden die Daten einer SQL
Abfrage auf virtuelle Tabellen verteilt.
fetch

 Erklärung: Map Phase 


 Beispiel: Group By Klausel  ‚ Wir möchten für jede Abteilung eines Unterneh-
mens, die Anzahl der dort beschäftigten Mitarbeiter,
‚ Wir möchten für jede Abteilung die Anzahl der Mit-
bestimmen.
arbeiter, die dort arbeiten, bestimmen.

‚ Mit der gegebenen Struktur der Datenbasis ist eine


‚ Für jede Abteilung instanziert die Datenbankengi-
ne eine eigene virtuelle Tabelle an. Die Angestell-
Lösung der Aufgabe nicht möglich.
tendaten werden nun in die virtuellen Tabellen der
‚ Zur Lösung der Aufgabe wäre es notwendig die An- zugehörigen Abteilungen übernommen.
gestellten jeder Abteilung in einer eigenen Tabelle
zu speichern. Die Anzahl der Mitarbeiter pro Ab-
‚ Nach der Map Phase liegen die Angestelltendaten
gruppiert auf ihre Abteilungen vor.
teilung könnte dann durch das Aufsummieren der
Datensätze der Tabellen, ermittelt werden. ‚ Mit der group by Klausel wird bestimmt nach wel-
chen Kriterien der Datenbestand gruppiert werden
‚ Die group by Klausel ermöglicht eine entsprechende
soll.
Neustrukturierung der Daten.

q q

56
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 18. Group by: Neustrukturierung von Daten

5.2.4 Group by Klausel ‚ Um eine Neustrukturierung der Daten der Abfrage


nach mehreren Kriterien durchzuführen werden die
Mit der group by Klausel wird bestimmt nach welchen
gewünschten Spalten in der group by Klausel defi-
Kriterien der Datenbestand gruppiert werden soll.
niert.

 Erklärung: Group by Klausel  ‚ Wir möchten nun wissen, wieviele Mitarbeiter in den
‚ Die disjunkten Werte, der in der group by Klausel einzenen Abteilungen, aufgeteilt auf die unterschied-
angegebenen Spalten, definieren die Gruppen auf die lichen Länder, arbeiten.
der Datenbestand verteilt werden soll.
 Query: Group by Klausel 
‚ Wird in einer Abfrage beispielsweise nach der 1 -- -------------------------------------------
department_id Spalte gruppiert, erfolgt eine Ver- 2 -- Group by Klausel
teilung der Datensätze des Datenbestandes auf die 3 -- -------------------------------------------
unterschiedlichen Abteilungen des Unternehmens. 4 SELECT department_id, country_id
5 count(employee_id) employee_count,
1 -- --------------------------------------
6 max(salary) max_salary,
2 -- Group by Klausel
7 min(salary) min_salary,
3 -- --------------------------------------
8 sum(salary) department_cost
4 SELECT department_id, count(employee_id),
9 FROM employees
5 avg(salary)
10 JOIN departments USING(department_id)
6 FROM employees
11 JOIN regions USING(region_id)
7 GROUP BY department_id;
12 GROUP BY country_id, department_id;

57
Informationssysteme

5.2.5 Semantik der Gruppenbildung 5.2.7 Aggregate Phase

Wird der Datenbestand einer Abfrage nach mehreren


Kriterien gruppiert, die im Kontext der Anwendung L Aggregate Phase 
denselben Sachverhalt beschreiben, wird für die Grup- In der Aggregate Phase werden die Datensät-
pierung der Daten nur eines der Kriterien ausgewer- ze der virtuellen Gruppen auf einen einzelnen
tet. Datensatz verdichtet.
 Query: Semantik der Gruppenbildung 
Die Datenbasis der Abfrage besteht nun aus
1 -- ---------------------------------------- den aggregierten Datensätzen.
2 -- Semantik der Gruppenbildung
3 -- ---------------------------------------- Nach der Map Phase des Gruppierungsvorgangs,
4 -- Die Spalten department_id und depart- liegen die Datensätze der Abfrage verteilt auf vir-
5 -- ment_name beschreiben im Kontext der tuelle Tabellen vor.
6 -- Anwendung denselben Sachverhalt.
7

8 SELECT department_id, department_name


9 FROM employees NATURAL JOIN departments
10 GROUP BY department_id, department_name;

5.2.6 Fallbeispiel: Gruppierung

SQL Abfragen mit der group by Klausel.


 Erklärung: Aggregate Phase 
 Query: Group by Klausel 
‚ In der Aggregate Phase werden die Datensätze der
1 -- ---------------------------------------- einzelnen virtuellen Tabelle auf einen einzelnen Da-
2 -- Anzahl der Angestellten pro Abteilung tensatz verdichtet.
3 -- ----------------------------------------
4 SELECT department_id, count(employee_id) ‚ Die Verdichtung der Datensätze erfordert dabei eine
5 avg(salary) Neustrukturierung der Daten. Für die Neustruktu-
6 FROM employees rierung der Daten gelten bestimmte Vorgaben.
7 GROUP BY department_id; ‚ Umstrukturierte Datensätze dürfen nur Werte ent-
8
halten, nach denen ursprünglich gruppiert worden
9 -- ---------------------------------------- ist.
10 -- Anzahl der Angestellten fuer jedes Land
11 -- ---------------------------------------- ‚ Zusätzlich kann einem Zieldatensatz das Ergebnis
12 SELECT country_id, count(employee_id) beliebiger Aggregatfunktionen zugeordnet werden.
13 avg(salary) ‚ Klauseln einer select Abfrage, die von der Daten-
14 FROM employees bankengine nach der group by Klausel ausgewertet
15 GROUP BY country_id; werden, haben nur mehr Zugriff auf die neustruktu-
16
rierten Daten.
17 -- ----------------------------------------
18 -- Anzahl der Angestellten pro Abteilung q
19 -- fuer jedes Land
20 -- ---------------------------------------- 5.2.8 Having Klausel
21 SELECT country_id, count(employee_id)
22 FROM employees Mit der having Klausel können für die in der group by
23 GROUP BY country_id, department_id; Klausel definierten Gruppen, Filterkriterien definiert
werden.

58
© Dipl.Ing.-Paul Panhofer Bsc.

 Analyse: Filter: having Klausel  .


‚ Mit der where Klausel kann der Datenbestand einer
Abfrage nach bestimmten Kriterien gefiltert werden.

Zeitlich erfolgt die Auswertung der where Klausel


in SQL Abfragen vor der Auswertung der group by
Klausel. Es fehlt damit die Möglichkeit die virtuel-
len Gruppen einer group by Klausel zu filtern.

‚ Mit der having Klausel stellt die SQL Spezifikation


eine Möglichkeit zur Verfügung, die virtuellen Grup-
pen der group by Klausel zu filtern.
‚ Wir haben damit eine Möglichkeit an der Hand eine
Selektion auf Gruppenebene durchzuführen.

1 -- --------------------------------------
2 -- having Klausel
3 -- --------------------------------------
4 SELECT department_id, min(salary) min_sal
5 FROM employees
6 JOIN departments USING (department_id)
7 GROUP BY department_id, job_id
8 HAVING sum(salary) < 10000;

5.2.9 Null Aggregat

L Null Aggregat 
Als Null Aggregat werden virtuelle Gruppen
bezeichnet, die aus Datensätzen bestehen
die keiner konkreten Gruppe zugeordnet wer-
den können.

 Erklärung: Null Aggregat 


‚ Alle Datensätze einer SQL Abfrage, die für eines der
Gruppierungskriterien keinen Wert besitzen, wer-
den in einer eigenen virtuellen Gruppe zusammen-
gefasst: dem Nullaggregat.
‚ Das NULLS FIRST bzw. NULLS LAST Schlüsselwort
bestimmt ob das Null Aggregat dem Ergebnis vor-
angestellt oder als letzte virtuelle Gruppe im Ergeb-
nis figuriert.

59
Informationssysteme

6. SQL - Komplexe Abfragen 6.1. Unterabfragen 

L Unterabfragen 
Unterabfragen sind select Ausdrücke, die in
SQL Abfragen eingebettet werden.

6.1.1 Unterabfragen

Oft gibt es Fragestellungen, die auf einfache Weise in


SQL nicht zu beantworten sind: z.B.: Wie heissen die
Mitarbeiter mit dem geringsten Einkommen im Unter-
nehmen?

 Analyse: Unterabfragen 
‚ Um diese Fragestellung beantworten zu können,
müßten wir erst einmal wissen wie hoch das gerings-
te Einkommen im Unternehmen ist, um anschlie-
ßend zu ermitteln, welche Mitarbeiter ein entspre-
chendes Einkommen beziehen.
01. Unterabfragen 60
‚ Das Problem: Zur Beantwortung der vorhergehen-
den Frage müßten 2 Abfragen zur selben Zeit abge-
02. With Klausel 63 setzt werden können.

03. Paarweise Vergleich 64 ‚ Wir brauchen damit einen neuen Ansatz: Unterab-
fragen.
04. Mengenoperationen 64

05. Quantoren 66

 Erklärung: Unterabfragen 
‚ Unterabfragen sind select Ausdrücke die in SQL
Abfragen eingebettet werden. Die SQL Spezifikati-
on erlaubt Unterabfragen in der select, from, where
bzw. having Klausel.

‚ Beim Auswerten einer SQL Abfrage, berechnet die


Datenbankengine zuerst das Ergebnis der Unterab-
fragen. Das Ergebnis der Unterabfrage steht der Ab-
frage dann in Form einer virtuellen Tabelle zur Ver-
fügung.

60
© Dipl.Ing.-Paul Panhofer Bsc.

6.1.2 Arten von Unterabfragen 6.1.3 Subqueryform: Innere View

Die SQL Spezifikation definiert mehrere Arten von Un- Unterabfragen in der from Klausel werden als Innere
terabfragen. Views bezeichnet.

 Auflistung: Arten von Unterabfragen   Erklärung: Innere View 


‚ In der from Klausel einer Abfrage wird die Daten-
 Innere View  basis einer Query definiert.

Unterabfragen in der from Klausel werden als ‚ Innere Views werden dabei vor der eigentlichen Ab-
Innere Views bezeichnet. frage ausgewertet. Das Ergebnis der Inneren View
bildet in diesem Fall die Datenbasis einer Abfrage.
In der from Klausel einer Abfrage wird die Da-
tenbasis einer Query definiert. Das Ergebnis ‚ Das Ergebnis der Auswertung wird dabei in einer
der Inneren View bildet in diesem Fall die Da- virtuellen Tabelle gepeichert.
tenbasis der Abfrage.
 Query: Innere View Beispiele 

2 Skalare Abfragen  1 -- ----------------------------------------


2 -- Subqueryform: Innere View
Subqueries die nach der Auswertung durch 3 -- ----------------------------------------
die SQL Engine als Ergebnis lediglich einen 4 SELECT e.first_name, e.last_name, e.salary
einzelnen Datensatz enthalten, werden als 5 FROM (SELECT max(salary) max_sal,
Skalare Abfragen bezeichnet. 6 department_id
7 FROM employees
In der select Klausel dürfen nur Skalare Abfra- 8 GROUP BY department_id) sub
gen definiert werden. 9 JOIN employees e
10 ON e.department_id = sub.depratmetn_id
11 AND e.salary = sub.max_sal;
3 Konditionale Abfragen 
12

Unterabfragen in der where Klausel bzw. ha- 13 SELECT e.frist_name, e.last_name, e.salary
ving Klausel werden als Konditionale Abfra- 14 e.department_id,
gen bezeichnet. 15 e.job_id
16 FROM employees e JOIN
Das Ergebins einer Konditionale Abfrage wird 17 (SELECT min(salary) m_sal
für die Auswertung der having bzw. where 18 FROM employees) sub_query
Klausel herangezogen. 19 ON e.salary = sub_query.m_sal
20 ORDER BY e.department_id;

q q

61
Informationssysteme

Konzept Beschreibung Seite

Innere View Unterabfragen in der from Klausel werden als Innere Views bezeichnet. Das Ergebnis einer 61
Inneren View bildet in diesem Fall die Datenbasis einer Abfrage.
Skalare Abfrage Subqueries die nach Ihrer Auswertung durch die Datenbankengine als Ergebnis lediglich 62
einen einzelnen Datensatz enthalten, werden als Skalare Abfragen bezeichnet. Skalare Ab-
fragen können in der select, from, where bzw. having Klausel definiert werden.
Konditionale Unterabfragen in der where Klausel bzw. having Klausel werden als Konditionale Abfragen 62
Abfrage bezeichnet. Das Ergebins einer Konditionale Abfrage wird für die Auswertung der having bzw.
where Klausel herangezogen.
With Klausel Mit der with Klausel kann SQL Code einfach und lesbar strukturiert werden. Dazu wird in der 63
with Klausel eine Liste von Queries definiert, die anschließend in der eigentlichen Abfrage
referenziert werden können.
Union Die union Klausel wird verwendet, um die Ergebnismengen zweier oder mehrerer select An- 64
weisungen miteinander zu kombinieren.
Intersect Die intersect Klausel wird verwendet, um die Durchschnittsmenge zweier oder mehrerer select 65
Anweisungen zu bilden.
Except Die except Klausel wird verwendet, um die Differenzmenge zweier oder mehrerer select An- 65
weisungen zu bilden.
Quantoren ??
Hierarchische ??
Abfragen

Abbildung 19. Konzepte komplexer Abfragen

6.1.4 Subqueryform: Skalare Abfragen 6.1.5 Subqueryform: Konditionale Abfrage

Subqueries die nach der Auswertung durch die SQL Unterabfragen in der where bzw. having Klausel wer-
Datenbankengine im Ergebnis lediglich einen einzel- den als Konditionale Unterabfragen bezeichnet.
nen Datensatz enthalten, werden als Skalare Abfragen
bezeichnet.  Erklärung: Konditionale Abfrage 

Unterabfragen in der select Klausel müssen Skalare


‚ Das Ergebins einer Konditionale Abfrage wird für
die Auswertung der having bzw. where Klausel her-
Abfragen sein.
angezogen.
 Query: Skalare Abfrage 
‚ Verwenden Sie für Vergleiche mit Konditionalen Ab-
1 -- ---------------------------------------- fragen den in Operator.
2 -- Subqueryform: Innere View
3 -- ----------------------------------------
 Query: Konditionale Unterabfragen 
4 SELECT e.frist_name, e.last_name,
5 (SELECT sum(salary) FROM employees) 1 -- ----------------------------------------
6 "company income" 2 -- Subqueryform: Unterabfragen
7 FROM employees e JOIN departments d 3 -- ----------------------------------------
8 ON e.department_id = d.department_id 4 SELECT e.first_name, e.last_name
9 GROUP BY e.department_id, 5 FROM employees e
10 d.department_name 6 WHERE e.salary in
11 ORDER BY d.department_name, e.last_name; 7 (SELECT min(salary) FROM employees);

q q

62
© Dipl.Ing.-Paul Panhofer Bsc.

6.2. With Klausel  6.2.2 Syntax: WITH Klausel

Datenbankabfragen für komplexe Fragestellungen sind In SQL Abfragen wird die with Klausel vor der select
oft schwer zu lesen bzw. zu verstehen. Klausel definiert.

Mit steigender Komplexität muss einen Weg gefun-  Syntax: WITH Klausel 
den werden, Abfragecode zu strukturieren. 1 -- ----------------------------------------
2 -- Syntax: with Klausel
 Erklärung: Codestrukturierung  3 -- ----------------------------------------
‚ SQL Code wird im Gegensatz zu funktionalen Pro- 4 WITH query_name1 AS (
grammiersprachen nicht über Unterprogrammen, 5 SELECT ...
sondern mit der Hilfe von Unterabfragen struktu- 6 ), query_name2 AS (
riert. 7 SELECT ...
8 ), query_name3 AS (
‚ Die Strukturierung von SQL Code mit Unterabfra- 9 SELECT ...
gen führt jedoch zu einer Verschachtelung des Ab- 10 )
fragecodes. 11 SELECT ...
‚ Unterabfragen müssen dabei von innen nach außen 12 FROM query_name1 q1
ausgewertet werden. 13 JOIN query_name2 q2 on ...
14 ...;
q 15

16 -- ----------------------------------------
17 -- Query: with Klausel
6.2.1 WITH Klausel - Strukturierung
18 -- ----------------------------------------
19 WITH rep_employees AS (
3 WITH Klausel - Strukturierung  20 SELECT max(salary) max_sal,
Mit der with Klausel kann SQL Code einfach 21 e.department_id
und lesbar strukturiert werden. Dazu wird in 22 FROM employees e
der with Klausel eine Liste von Queries defi- 23 GROUP BY e.department_id
niert, die anschließend in der eigentlichen Ab- 24 )
frage referenziert werden können. 25 SELECT e.department_id
26 e.first_name
Die in der with Klausel definierten Abfragen 27 FROM employees e
werden als Innere Views referenziert. 28 JOIN rep_employees r ON
29 e.salary = r.max_sal AND
30 e.department_id = r.department_id
q
31 JOIN departments d ON
32 d.department_id = e.department_id
33 ORDER BY d.department_name;

63
Informationssysteme

6.3. Paarweise Vergleich  6.4. Mengenoperationen 

6.4.1 Union Klausel - Vereinigungsmenge


L Tupel 
Ein Tupel bezeichnet eine Liste von Werten. Die union Klausel wird verwendet, um die Ergebnis-
Dabei spielt, im Gegensatz zu einer Menge mengen zweier oder mehrerer select Anweisungen mit-
von Werten die Reihenfolge der Objekte eine einander zu kombinieren.
Rolle.
 Erklärung: union, union all Klausel 
Der Begriff Tupel kann dabei synonym für Da- ‚ Um die Ergebnisse 2er Queries miteinander kombi-
tensatz verwendet werden. nieren zu können, muss die Struktur der Ergebnis-
datensätze beider Abfragen übereinstimmen.

‚ Verwenden Sie die union Klausel statt der union all


6.3.1 Paarweise Vergleich Klausel um Kopien des gleichen Datensatzes aus der
Ergebnismengen der Abfrage zu entfernen.
Beim Paarweisen Vergleich werden 2 Tupeln auf Gle-
ichheit geprüft.

 Erklärung: Paarweise Vergleich 


‚ Im Zuge des Paarweisen Vergleichs werden die Ein-
zelwerte eines Tupels mit den Einzelwerten eines an-
deren Tupels positionell auf Gleichheit geprüft.

‚ Stimmen die Einzelwerte überein, resultiert der Ver-


gleich zu true.

‚ Der Paarweise Vergleich wird verwendet um ein Tu-


pel gegen das Ergebnis einer Konditionalen Abfra-
ge zu prüfen. Verwenden Sie dazu den in Operator.
 Syntax: union, union all Klausel 
1 -- ----------------------------------------
2 -- Syntax: Union, Union all Klausel
 Query: Paarweise Vergleich 
3 -- ----------------------------------------
1 -- ---------------------------------------- 4 SELECT Ausdruck1, Ausdruck2, ... Ausdruck_n
2 -- Paarweise Vergleich 5 FROM Tabellen
3 -- ---------------------------------------- 6 UNION [ALL]
4 -- Finden Sie alle Mitarbeiter die in ihrer 7 SELECT Ausdruck1, Ausdruck2, ... Ausdruck_n
5 -- Abteilung das mindeste Gehalt beziehen. 8 FROM Tabellen;
6
9
7 SELECT last_name, first_name, job_id, 10 -- ----------------------------------------
8 salary, 11 -- Union, Union all Klausel
9 department_id 12 -- ----------------------------------------
10 FROM employees 13 SELECT last_name, first_name,
11 WHERE (department_name, 14 department_id
12 department_id, 15 FROM employess
13 salary) 16 WHERE salary =
14 IN 17 (SELECT min(salary) FROM employees)
15 (SELECT department_name, 18 UNION ALL
16 department_id, 19 SELECT last_name, first_name,
17 min(salary) 20 department_id
18 FROM employees 21 FROM employess
19 GROUP BY department_id) 22 WHERE salary =
20 ORDER BY last_name, first_name; 23 (SELECT max(salary) FROM employees);

q q

64
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 20. Mengenoperation: Intersect

6.4.2 Intersect Klausel - Durchschnittsmenge 6.4.3 Except Klausel - Differenzmenge

Mit der intersect Klausel kann die Durchschnittsmen- Mit der except Klausel kann die Differenzmenge der
ge der Ergebnisdatensätze zweier oder mehrerer select Ergebnisdatensätze zweier oder mehrerer select Anwei-
Anweisungen ermittelt werden. sungen ermittelt werden.

 Syntax: except Klausel 


 Syntax: intersect Klausel 
1 -- ----------------------------------------
1 -- ----------------------------------------
2 -- Syntax: except Klausel
2 -- Syntax: intersect Klausel
3 -- ----------------------------------------
3 -- ----------------------------------------
4 SELECT Ausdruck1, Ausdruck2, ... Ausdruck_n
4 SELECT Ausdruck1, Ausdruck2, ... Ausdruck_n
5 FROM Tabellen
5 FROM Tabellen
6 EXCEPT
6 INTERSECT
7 SELECT Ausdruck1, Ausdruck2, ... Ausdruck_n
7 SELECT Ausdruck1, Ausdruck2, ... Ausdruck_n
8 FROM Tabellen;
8 FROM Tabellen;
9
9
10 -- ----------------------------------------
10 -- ----------------------------------------
11 -- except Klausel
11 -- intersect Klausel
12 -- ----------------------------------------
12 -- ----------------------------------------
13 SELECT last_name, first_name, department_id
13 SELECT last_name, first_name, department_id
14 FROM employess
14 FROM employess
15 WHERE salary =
15 WHERE salary =
16 (SELECT min(salary) FROM employees)
16 (SELECT min(salary) FROM employees)
17 EXCEPT
17 INTERSECT
18 SELECT last_name, first_name, department_id
18 SELECT last_name, first_name, department_id
19 FROM employess
19 FROM employess
20 WHERE salary =
20 WHERE salary =
21 (SELECT max(salary) FROM employees);
21 (SELECT max(salary) FROM employees);

q
q

65
Informationssysteme

6.5. Quantoren  .

L Quantoren 

66
© Dipl.Ing.-Paul Panhofer Bsc.

. .

67
Informationssysteme

7. SQL - Data Definition Language 7.1. Datenbankartefakte 

L Data Definition Language 


DDL Befehle werden verwendet, um die Struk-
tur einer relationalen Datenbank zu definieren
bzw. zu verändern.

7.1.1 Datenbankartefakte

Datenbankartefakte beschreiben die Struktur einer


Datenbank.

L | 
 Auflistung: Datenbankartefakte 
‚ Schema: Ein Schema ist ein logischer Namensraum
für die Tabellen eines Geschäftsfalls. Im Sparchge-
brauch wird ein Schema auch als Datenbank bezeich-
net. Ein Datenbankserver kann mehrere Datenban-
01. Datenbankartefakte 68
ken verwalten.
02. Tabelle 69 ‚ Tabelle: Ein Datenbankschema ist ein logischer Na-
mensraum für die Daten eines Geschäftfalls. Tabel-
03. View 72 len repräsentieren die Aspekte der Anwendungsda-
ten. Aus technischer Sicht speichern Tabellen Daten
04. Index 73 in Form von Datensätzen.

05. Constraint 76 ‚ Constraints: Constraints werden verwendet um die


Konsistenz der Daten in der Datenbank sicherzu-
06. Sequenz 78 stellen.
Die SQL Spezifikation unterstützt mehrere Formen
von Constraints um die unterschiedlichen Formen
der Konsistenz - Bereichsidentität, Logische Kon-
sistenz, Referentielle Konsistenz, Entitätsintegrität
- zu gewährleisten.

‚ Sequenz: Mit Hilfe einer Datenbanksequenz kön-


nen Sequenzen aufeinanderfolgender Werte generiert
werden. Sequenzen werden in der Regel zur Generie-
rung von Schlüsselwerten definiert.
‚ Trigger: Trigger sind Datenbankroutinen deren
Ausführung durch Ereignisse angestossen wird.

‚ View: Eine View ist eine vorkompilierte Datenban-


kabfrage.

‚ Index: Ein Datenbankindex hilft die Suche und das


Sortieren von Datensätzen zu beschleunigen.

68
© Dipl.Ing.-Paul Panhofer Bsc.

Befehl Beschreibung Seite

CREATE TABLE Der CREATE TABLE Befehl wird zum Anlegen einer Tabelle in der Datenbank ver- 70
wendet. Der Befehl besitzt dabei 2 unterschiedliche Ausprägungen um die Struk-
tur der Tabelle zu definieren.
ALTER TABLE Der ALTER TABLE Befehl wird zum Bearbeiten der Struktur einer Tabelle in der Da- 71
tenbank verwendet. Der Befehl besitzt dabei unterschiedliche Ausprägungen und
Optionen zum Löschen bzw. Hinzufügen von Feldern bzw. Constraints.
DROP TABLE Der DROP TABLE Befehl wird zum Löschen einer Tabelle in der Datenbank 70
verwendet.
TRUNCATE TABLE Der TRUNCATE TABLE Befehl wird zum Löschen der Datensätze einer Tabelle 71
verwendet.
CREATE VIEW Der CREATE VIEW Befehl zum Anlegen einer View in der Datenbank verwendet. 72
DROP VIEW Der DROP VIEW Befehl zum Löschen einer View in der Datenbank verwendet. 73
CREATE SEQUENCE Der CREATE SEQUENCE Befehl zum Anlegen einer Sequenz in der Datanbank ver- ??
wendet. Der Befehl besitzt unterschiedliche Optionen um die Sequenz an den
geforderten Geschäftsfall anpassen zu können.
DROP SEQUENCE Der DROP SEQUENCE Befehl zum Löschen einer Sequenz aus der Datenbank ??
verwendet.

Abbildung 21. DDL Befehle

7.2. Tabelle  7.2.2 Spaltendefinition

Eine Datenbanktabelle repräsentiert einen Aspekt


L Spaltendefinition 
eines spezifischen Geschäftsfalls.
Zur Definition der Struktur einer Tabelle wer-
den Spaltendefinitionen verwendet. Die Spal-
7.2.1 Datenbankartefakt: Tabelle tendefinition für eine Datenbanktabelle folgt
einem strikt vorgegebenem Muster:
 Datenbanktabelle  spaltenbezeicher datentyp [attribute+]
Datenbanktabellen bestehen aus Zeilen und
Spalten. Daten werden in Form von Datensät-
 Erklärung: Spaltendefinietion 
zen in einer Tabelle gespeichert.
‚ Spaltenbezeicher: Für eine Tabellenspalte kann ein
‚ Zeile: Datensätze werden zeilenweise in ei- beliebiger Spaltenbezeicher gewählt werden. Es ist
ner Tabelle gespeichert. jedoch darauf zu achten daß der Bezeicher nicht
mehr als 32 Zeichen lang sein sowie keine Sonder-
‚ Spalte: Die Spalten einer Tabelle entspre- zeichen enthalten darf.
chen den Attributen eines Datensatzes.
‚ Datentyp: Jeder Spalte einer Tabelle ist ein spezi-
fischer Datentyp zugeordnet. Nur Werte des fest-
 Erklärung: Datenbanktabellen  gelegten Datentyps können in der entsprechenden
‚ Der create table Befehl wird verwendet um Daten- Spalte gespeichert werden.
banktabellen anzulegen. Der Befehl besitzt dabei 2
unterschiedliche Ausprägungen um die Struktur der
‚ Attribute: Optional können für eine Spalte eine Rei-
he von Attributen definiert werden.
Tabelle zu definieren.

q q

69
Informationssysteme

7.2.3 Schlüsseldefinition 7.2.5 Fallbeispiel: create table

Beim Anlegen einer Tabelle wird die Struktur der Ta- Der create table Befehl wird zum Anlegen einer Ta-
belle über Spaltendefinitionen definiert. belle verwendet.

Eine der Spalten der Tabelle muß als Schlüsselspal-  DDL: employees, departments 
te designiert werden. Diese Spalte wird nun als Pri- 1 -- ----------------------------------------
märschlüssel der Tabelle bezeichnet. 2 -- Fallbeispiel: hr schema
3 -- ----------------------------------------
4 CREATE TABLE employees (
L Primärschlüssel 
5 employee_id NUMBER(19,0) NOT NULL,
Anhand eines Primärschlüssels können die in 6 salary NUMBER(10,0) NOT NULL,
der Tabelle gespeicherten Datensätze unter- 7 job_id NUMBER(19,0) NOT NULL,
schieden werden. 8 first_name VARCHAR(30) NOT NULL,
9 middle_name VARCHAR(30) NOT NULL,
 Erklärung: Schlüsseldefinition  10 last_name VARCHAR(30) NOT NULL,
11 department_id NUMBER(19,0) NOT NULL,
‚ Ein Schlüssel kann aus einer oder mehreren Spalten
12
bestehen. Ein Schlüssel darf sich dabei nur aus so-
13 PRIMARY KEY (employee_id),
vielen Spalten zusammensetzen, die notwendig sind,
14 CONTRAINT fk_departments_dep_id
um die Datensätze der Tabelle zu identifizieren.
15 FOREIGN KEY (department_id)
‚ Schlüsseldefinition: Bestimmte Spalten der Tabelle 16 REFERENCES departments (department_id)
können auch als Fremdschlüsselspalten ausgewie- 17 );
sen werden. Fremdschlüssel sind Verweise auf Pri- 18

märschlüssel anderer Tabellen. Damit können Rela- 19 CREATE TABLE departments (


tionen zwischen Tabellen definiert werden. 20 department_id NUMBER(19,0) NOT NULL UNIQUE,
21 location_id NUMBER(19,0) NOT NULL,
q
22 dep_name VARCHAR(30) NOT NULL,
23

7.2.4 DDL Befehl: create table 24 PRIMARY KEY (department_id),


25 CONSTRAINT fk_location_location_id
Der create table Befehl wird zum Anlegen einer Ta- 26 FOREIGN KEY (location_id)
belle verwendet. 27 REFERENCES locations (location_id)
 Syntax: create table  28 ON DELETE CASCADE
1 -- ---------------------------------------- 29 );
2 -- Syntax: CREATE TABEL
3 -- ---------------------------------------- q
4 CREATE TABLE table_name (
5 column1 datatype [NOT NULL|NULL|UNIQUE],
6 ... 7.2.6 DDL Befehl: drop table
7 columnN datatype, Der drop table Befehl wird zum Löschen von Tabellen
8 PRIMARY KEY (column_name+), aus der Datenbank verwendet.
9 [CONSTRAINT fk_name FOREIGN KEY
(column_name+)  DDL: Tabellen verwalten 
10 REFERENCES table_name (column_name+) 1 -- ----------------------------------------
11 [ON DELETE CASCADE]] 2 -- Befehl: DROP TABLE
12 ); 3 -- ----------------------------------------
13 4 -- Befehl: Table Artefakte loeschen
14 CREATE TABLE table_name AS 5 DROP TABLE table_name;
15 SELECT column1, column2, ... 6

16 FROM existing_table_name; 7 DROP TABLE students;

q q

70
© Dipl.Ing.-Paul Panhofer Bsc.

7.2.7 DDL Befehl: truncate table 7.2.9 Fallbeispiel: alter table

Der truncate table Befehl wird zum Löschen aller Der alter table Befehl wird verwendet um die Struk-
Datensätze einer Tabelle verwendet. tur der Tabellen der Datenbank zu verwalten.

 DDL: Datensätze löschen   DDL: alter table Beispiele 


1 -- ---------------------------------------- 1 -- ----------------------------------------
2 -- Befehl: TRUNCATE TABLE 2 -- Fallbeispiel: ALTER TABLE
3 -- ---------------------------------------- 3 -- ----------------------------------------
4 -- Befehl: Table Artefakte loeschen 4 -- Befehl: Constraints hinzufuegen/loeschen
5 TRUNCATE TABLE table_name; 5 ALTER TABLE c_project_partners
6 6 ADD CONSTRAINT fk_project_partners
7 TRUNCATE TABLE students; 7 FOREIGN KEY project_id
8 REFERENCES c_projects (project_id);
q 9

10 ALTER TABLE c_projects ADD CONSTRAINT


11 uq_projects_code UNIQUE (project_code);
7.2.8 DDL Befehl: alter table
12

Der alter table Befehl wird verwendet um die Struk- 13 ALTER TABLE c_projects DROP CONSTRAINT
tur der Tabellen der Datenbank zu verwalten. 14 uq_projects_code;
15
Der Befehl besitzt unterschiedliche Ausprägungen
16 ALTER TABLE c_projects ADD CONSTRAINT
und Optionen für das Löschen bzw. Hinzufügen von
17 check_legal_type CHECK
Feldern bzw. Constraints.
18 (legal_foundation IN (’P_26’, ’P_27’));
 Syntax: alter table  19

1 -- ---------------------------------------- 20 -- Befehl Constraints ein-/ausschalten


2 -- Syntax: ALTER TABLE 21 ALTER TABLE c_projects DISABLE CONSTRAINT
3 -- ---------------------------------------- 22 uq_projects_code;
4 ALTER TABLE table_name { 23

5 RENAME TABLE TO new_table_name | 24 ALTER TABLE c_projects ENABLE CONSTRAINT


6 MODIFY (column action) | 25 uq_projects_code;
7 ADD (column datatype attribute) | 26

8 DROP (column) | 27 -- Spalteneigenschaften veraendern


9 ADD CONSTRAINT fk_name 28 ALTER TABLE c_projects
10 FOREIGN KEY (column+) 29 MODIFY description VARCHAR2(4000);
11 REFERENCES table (column_name+) | 30

12 RENAME CONSTRAINT old TO new | 31 ALTER TABLE c_projects MODIFY (


13 DROP CONSTRAINT constraint_name | 32 is_ffg_sponsered NUMBER(1) NOT NULL,
14 DROP PRIMARY KEY 33 is_fwf_sponsered NUMBER(1) NOT NULL,
15 } 34 is_eu_sponsered NUMBER(1) NOT NULL
16 35 );
17 -- ---------------------------------------- 36

18 -- Fallbeispiel: ALTER TABLE 37 -- Spalten hinzufuegen


19 -- ---------------------------------------- 38 ALTER TABLE c_projects ADD description
20 -- Tabelle umbenennen 39 VARCHAR(255);
21 ALTER TABLE projects RENAME TO c_projects; 40

22 41 ALTER TABLE c_projects ADD (


23 ALTER TABLE c_projects ADD ( 42 is_ffg_sponsered NUMBER(1),
24 is_ffg_sponsered NUMBER(1), 43 is_fwf_sponsered NUMBER(1),
25 is_fwf_sponsered NUMBER(1) 44 is_eu_sponsered NUMBER(1)
26 ); 45 );

q q

71
Informationssysteme

7.3. View  7.3.3 DDL Befehl: create view

Mit einer View kann eine SQL Abfrage als Objekt in Views werden mit dem create view Befehlt angelegt.
der Datenbank gespeichert werden.
Je nach Situation können einzelne Klauseln der View
unwirksam sein oder zu unklaren Ergebnissen füh-
7.3.1 Datenbankartefakt: View ren.

 Erklärung: Restriktionen einer View 


L View  ‚ Die order by Klausel einer View wird ignoriert,
Eine View ist eine SQL Abfrage, die in der Da- wenn in der select Abfrage selbst eine Sortierung
tenbank als Objekt gespeichert wird. definiert wird.

 Syntax: create view 


Beim Aufruf einer View wird die mit der View as-
1 -- ----------------------------------------
sozierte Abfrage ausgeführt.
2 -- Syntax: create view
3 -- ----------------------------------------
 Erklärung: Verwendung von Views 
4 CREATE OR REPLACE VIEW view_name
‚ Mit einer View wird der Zugriff auf die Daten der 5 [(spalten_namen)]
Datenbank vereinfacht. 6 AS <select Ausdruck>;
7
‚ Zusätzlich maskiert die View die Struktur der Da-
tenbank vor dem User. 8 -- ----------------------------------------
9 -- DDL: View anlegen
q 10 -- ----------------------------------------
11 CREATE OR REPLACE VIEW employees_dep
12 (FIRST_NAME, LAST_NAME, DEPARTMENT_NAME)
7.3.2 Einsatz von Views 13 AS
Views spielen eine zentrale Rolle in der Entwicklung 14 SELECT e.FIRST_NAME,
relationaler Datenbanken. 15 e.LAST_NAME,
16 d.DEPARTMENT_NAME
 Auflistung: Einsatz von Views  17 FROM employees e join departments d
18 using(DEPARMENT_ID);
‚ Komplexitätsreduktion: Mit Views wird der Da-
19
tenzugriff vereinfacht.
20

Normalisierte Datenbankschema abstrahieren ein 21 CREATE OR REPLACE VIEW mvp_employees


komplexes Netzwerk von Tabellen und Relationen. 22 AS
SQL Abfragen in solchen Strukturen sind komplex 23 SELECT e.FIRST_NAME,
und umfangreich. Views werden verwendet um die 24 e.LAST_NAME,
Komplexität von Abfragen für den User zu abstra- 25 e.DEPARTMENT_ID
hieren. 26 FROM employees e
27 JOIN
‚ Datenschutz: Mit Views wird die Datenstruktur ei- 28 (SELECT max(SALARY) MAX_SALARY,
ner Datenbank maskiert. 29 DEPARTMENT_ID
In der Regel ist es nicht erwünscht, die Struktur 30 FROM employees
einer Datenbank nach außen zu publizieren. Views 31 GROUP BY DEPARTMENT_ID) sub
helfen die Details eines Schemas vor Useren zu ver- 32 ON e.SALARY = sub.MAX_SALARY AND
stecken. 33 e.DEPARTMENT_ID = sub.DEPARTMENT_ID;
34

‚ Kompiliersicherheit: Beim Speichern der View, 35 -- View verwenden


wird die mit der View assozierte Abfrage kompiliert 36 SELECT first_name, last_name from
und auf syntaktische Richtigkeit geprüft. employees_dep;

q
q

72
© Dipl.Ing.-Paul Panhofer Bsc.

7.3.4 Variable Bedingungen 7.4. Index 


Eine view selbst kann keine variablen Parameter
für die where Klausel enthalten. L Index 
 DDL: variable Bedingungen  Der Datenbankindex einer Tabelle, ist eine von
1 -- ---------------------------------------- der eigentlichen Tabelle getrennte Struktur,
2 -- DDL: variable Bedinugen zur Beschleunigung der Suche bzw. Sortierung
3 -- ---------------------------------------- von Daten.
4 CREATE OR REPLACE VIEW employees_department
5 (FIRST_NAME, LAST_NAME, DEPARTMENT_ID) Ein Datenbankindex kann mit dem Index am Ende
6 AS eines Buches verglichen werden.
7 SELECT e.FIRST_NAME, e.LAST_NAME, e.DEP_ID
8 FROM employees e join departments d
7.4.1 Datenbankartefakt: Index
9 using(DEPARMENT_ID);
10 Ein Index besteht aus einer Menge von Schlüsseln, die
11 -- Query: View verwenden aus den Daten der indexierten Spalten der Tabelle ge-
12 SELECT LAST_NAME, FIRST_NAME neriert werden.
13 FROM employees_dep
 Erklärung: Datenbankindex 
14 WHERE DEPARTMENT_ID = ’IT’;
‚ Ein Index ordnet jedem Eintrag einer indizierten
Spalte seine Position im Datenbestand der Tabelle
q
zu.

7.3.5 DDL Befehl: drop view ‚ Auswertungen auf indizierten Spalten haben im Ver-
gleich zu gewöhnlichen SQL Abfragen eine verbes-
 Syntax: drop view  serte Laufzeit.
1 -- ---------------------------------------- q
2 -- DDL: View lschen
3 -- ----------------------------------------
4 DROP VIEW employees_dep;

73
Informationssysteme

Indextyp Beschreibung Spaltentypen

B* Index Datenbankindex zum Indexieren von Spalten mit alphanu- varchar, number
merischen bzw. numerischen Werten. z.B.: Nachnamen bzw.
Ortsnamen
Unique Index Datenbankindex zum Indexieren von Spalten mit einem unique unique Constraint
Constraint. z.B.: Spalten mit einem Primary Key Constraint.
Funktionsindex Datenbankindex zum Indexieren von Spalten deren Werte durch
Funktionen transformiert werden. z.B.: lower(first_name)
Volltextindex Datenbankindex zum Indexieren von Spalten die umfangreiche clob, word, pdf, html
Texte speichern.

Abbildung 22. Indextypen

Es sollte nur für jene Spalten einer Tabelle ein Index 7.4.3 Indextyp: Funktionsindex
definiert werden, die für die Sortierung bzw. Filte-
rung des Datenbestandes in select Abfragen relevant Ein funktionsbasierter Index stellt insofern eine Beson-
sind. derheit dar, als nicht ein Spaltenwert indiziert wird,
sondern das Ergebnis einer Funktion.
 Analyse: Datenbankindex 
‚ Ein Datenbankindex nimmt Speicherplatz in An-  Erklärung: Funktionsbasierter Index 
spruch. Je mehr Datensätze in einer Tabelle gespei- ‚ Für den funktionsbasierten Index wird also für jede
chert werden, desto mehr Speicher muß für einen zu inidizierende Zeile der Funktionswert berechnet
Index allokiert werden. und das Ergebnis im Index abgelegt.
‚ Insert, Update bzw Merge Anweisungen stoßen für ‚ Wird nun in einer Abfrage nach einer indizierten
indexierte Spalten eine Neuberechnung des Index an. Funktion gesucht, braucht diese Funktion nicht mehr
berechnet zu werden, sondern das Ergebnis wird di-
q
rekt aus dem Index gelesen.

 Syntax: create index 


7.4.2 Indextyp: B* Index
1 -- ----------------------------------------
Der Standardindex in relationalen Datenbank ist der 2 -- Funktionsbasierter Index
B* Index. 3 -- ----------------------------------------
 Erklärung: B* Index  4 -- Indexdefinition
5 CREATE INDEX idx_f_department_name_substr
‚ Der B* Index hat grob gesagt den Aufbau eines Bau-
6 ON
mes. Die Einträge des Index kennen sowohl Ihren
7 departments(substr(department_name,1,1));
Vorgänger bzw. Nachfolger.
8

‚ Der B* Index kommt damit in erster Linie in Be- 9 -- SELECT Anweisung


reichssuchen zum Einsatz. z.B.: Telephonbuch 10 SELECT department_id, department_name, man_id
11 substr(department_name, 1,1) ||
 Syntax: create index  12 CASE
13 WHEN instr (department_name, ’ ’, 1,1) >0
1 -- ----------------------------------------
14 THEN substr(department_name,
2 -- B* Index
15 instr(department_name, ’ ’,1,1)+1,1)
3 -- ----------------------------------------
16 END
4 CREATE INDEX idx_emp_last_name
17 FROM departments;
5 on employees(last_name);

q
q

74
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 23. Indexstruktur

7.4.4 Indextyp: Unique Index 7.4.5 Indextyp: Volltextindex

Für Datenbankspalten mit einem unique Constraint, Durch die Verwendung eines Volltextindex können
wird durch die Datenbankengine automatisch ein uni- Volltextsuchen in relationalen Datenbanken signifikant
que Index angelegt. beschleunigt werden.

Die Volltextsuche wurde entwickelt um Word, Pdf


bzw. Html Dokumente, die in der Datenbank gespei-
chert werden, zu durchsuchen.

 Syntax: create index 


1 -- ----------------------------------------
2 -- Volltextindizierung: Context
3 -- ----------------------------------------
4 -- Tabellendefinition
5 CREATE TABLE c_projects (
6 project_id NUMBER(19,0) NOT NULL,
 Erklärung: unique Index  7 manager_id NUMBER(19,0) NOT NULL,
‚ Ein unique Index kann auch über mehrere Spalten 8 parent_id NUMBER(19,0) NOT NULL,
hinweg definiert werden. In diesem Fall müssen die 9 is_fwf_funded NUMBER(1) NOT NULL,
kombinierten Werte der Spalten eindeutig sein. 10 is_ffg_funded NUMBER(1) NOT NULL,
11 is_ssk_funded NUMBER(1) NOT NULL,
‚ In der Regel wird dieser Index Typ durch die Da-
12 description VARCHAR2(4000),
tenbankengine angelegt.
13 title VARCHAR(255) NOT NULL UNIQUE,
 Syntax: create index  14 PRIMARY KEY (project_id)
15 )
1 -- ----------------------------------------
16
2 -- unique Index
17 CREATE INDEX idx_full_text_ctx
3 -- ----------------------------------------
18 ON
4 CREATE UNIQUE INDEX
19 table_name(text)
5 idx_department_name
20 INDEXTYPE IS ctxsys.context;
6 on departments(department_name);
21
7
22 CREATE INDEX pro_des_index
8 CREATE UNIQUE INDEX
23 ON
9 idx_project_description
24 c_projects(description)
10 on projects(titel);
25 INDEXTYPE IS ctxsys.context;

q
q

75
Informationssysteme

Abbildung 24. Formen der Datenkonsistenz

7.5. Constraints 
¤ Entitätsintegrität 
Datenkonsistenz bzw. Datenintegrität beschreibt die Jeder Datensatz in der Datenbank muß ein-
Korrektheit, der in einer Datenbank gespeicherten deutig identifizierbar sein.
Daten.
Kann für eine Datenbank Datenkonsistenz nicht
garantiert werden, muß von Fehlern im Datenbe-
7.5.1 Datenkonsistenz und Integrität
stand ausgegangen werden.
Der Datenbestand einer Datenbank ist konsistent,
q
wenn alle Integritätsbedingungen erfüllt werden kön-
nen.
7.5.2 Datenbankconstraints
 Auflistung: Integritätsbedingungen 
Konstraints formulieren Bediengungen die Daten er-
 Bereichsidentität  füllen müssen bevor sie in den Datenbestand geschrie-
ben werden können.
Der Wert jedes Feldes eines Datensatzes muss
einem bestimmten Wertebereich zugeordnet
 Auflistung: Arten von Constraints 
werden können.
‚ not null: Legt fest, dass eine Spalte mit einem not
null Constraint immer einen Wert enthalten muss.
( Logische Konsistenz 
‚ unique: Legt fest, dass eine Spalte mit einem uni-
Logische Konsistenz wird durch die Regeln der que Constraint für jede Zeile einen anderen Wert
durch die Anwendung vorgegebenen Ge- enthalten muss.
schäftsprozesse bestimmt.
‚ check: Der check Constraints: wird verwendet um
die logische Konsistenz in der Datenbank sicherzu-
( Referentielle Konsistenz  stellen.

Beziehungen zwischen Datensätzen müssen ‚ primary key: Primary Keys werden verwendet um
zwischen logisch assozierten Objekten defi- Entitätsintegrität sicherzustellen.
niert sein.
q

76
© Dipl.Ing.-Paul Panhofer Bsc.

Integritätsbedingungen Beschreibung Constraint

Bereichsintegrität Durch den Einsatz von Datentypen kann Bereichsintegrität für Datentypen
den Datenbestand einer Datenbank sichergestellt werden.
Entitätsintegrität Mit Primärschlüssel kann Entitätsintegrität für die Datensätze der PRIMARY KEY
Datenbank sichergestellt werden.
Referentielle Konsistenz Mit der Definition von Fremdschlüsseln kann referentielle Integri- FOREIGN KEY
tät für den Datenbestandes eines Geschäftsfalls sichergestellt
werden.
Logische Konsistenz Die SQL Spezifikation setzt den Check Constraint zur Verfügung CHECK CONSTRAINT
um logische Konsistenz zu implementieren.

Abbildung 25. Integritätsbedingungen

7.5.3 Definieren von Datenbankconstraints 7.5.4 Constraintmonitoring

Constraints werden den Tabelle zugeschrieben, für die


 Query: Constraintmonitoring 
sie mittels create table oder alter table definiert
wurden. 1 -- ----------------------------------------
2 -- Constraints einsehen
 Erklärung: Anlegen von Constraints  3 -- ----------------------------------------
‚ Constraints sind keine eigenständigen Datenban- 4 SELECT table_name, constraint_name,
kobjekte. Wird eine Tabelle gelöscht, werden auto- 5 column_name, owner
matisch alle zugehörigen Constraints gelöscht. 6 FROM user_cons_columns
7 WHERE table_name = ’projects’;
‚ Constraints können entweder beim Erstellen der
8
Tabelle oder mit dem alter table Befehl angelegt
9 SELECT constraint_name,
werden.
10 constraint_type,
 Syntax: Constraints anlegen  11 last_change,
12 status
1 -- ----------------------------------------
13 FROM user_constraints
2 -- Syntax: Constraints anlegen
14 WHERE table_name = ’projects’;
3 -- ----------------------------------------
4 CREATE TABLE table(
5 column datatype [column_constraint], q
6 column datatype [column_constraint],
7 ...
8 [table_constraint]
9 );
10

11 CREATE TABLE employees(


12 employee_id NUMBER(19,0) NOT NULL
13 first_name VARCHAR(30) NOT NULL,
14 last_name VARCHAR(30) NOT NULL,
15 ...
16 PRIMARY KEY employee_id
17 )

77
Informationssysteme

7.5.5 Check Constraint 7.6. Sequenz 


Der Check Constraint wird verwendet um logische
Konsistenz in Datenbanken sicherzustellen.
L Sequenz 
 Erklärung: Check Constraint  Eine Sequenz ist ein Datenbankobjekt, mit
‚ Der check Constraint erlaubt spezifische Einschrän- dem eindeutige fortlaufende Werte generiert
kungen für Attributwerte zu definieren. werden.

‚ Die Einschränkungen werden durch die Angabe von


logischen Termen definiert.
7.6.1 Anlegen von Sequenzen
Sequenzen werden zur Generierung von Primär-
schlüsseln verwendet.

 Syntax: create sequence 


1 -- ----------------------------------------
2 -- Syntax: create sequence
3 -- ----------------------------------------
4 <CREATE SEQUENCE-Anweisung > :=
5 CREATE SEQUENCE Sequencename
6 [ INCREMENT BY integer ]
 DDL: Check Constraint  7 [ START WITH integer]
1 -- ---------------------------------------- 8 [ MAXVALUE integer | NOMAXVALUE ]
2 -- CHECK CONSTRAINT anlegen 9 [ MINVALUE integer | NOMINVALUE ]
3 -- ---------------------------------------- 10 [ CYCLE | NOCYCLE]
4 CREATE TABLE projects ( 11 [ CACHE | NOCACHE]
5 ID int NOT NULL, 12 [ ORDER | NOORDER ]
6 DURATION int, 13
7 CONSTRAINT CHK_PROJECTS CHECK 14 INCREMENT BY int
8 (DURATION <= 18 AND DURATION >= 1) 15 -- bestimmt die ganze Zahl,um die eine
9 ); 16 -- SEQUENCE erhoeht wird
10
17
11 -- ---------------------------------------- 18 START WITH int
12 -- Spaltenconstraint hinzufgen 19 -- bestimmt die ganze Zahl,mit der die
13 -- ---------------------------------------- SEQUENCE
14 ALTER TABLE projects 20 -- startet
15 ADD CHECK (DURATION >= 1); 21
16
22 MAXVALUE int
17
23 -- obere Grenze der SEQUENCE
18 ALTER TABLE projects 24
19 ADD CHECK (length(TITLE) >= 1 25 NOMAXVALUE
20 and 26 -- SEQUENCE hat keine obere Grenze
21 length(TITLE) <= 20); 27
22
28 MINVALUE int
23 -- ---------------------------------------- 29 -- untere Grenze der SEQUENCE bei absteigenden
24 -- Tabellenconstraint hinzufgen 30 -- SEQUENCEN. Der DEAULT fuer MINVALUE ist 1,
25 -- ---------------------------------------- 31 -- wenn MINVALUE nicht angegeben ist
26 ALTER TABLE projects 32
27 ADD CONSTRAINT CHK_PROJECT_DURATION CHECK 33 NOMINVALUE
28 (DURATION <= 18 AND DURATION >= 1); 34 -- SEQUENCE hat keine untere Grenze
35

q 36 CYCLE|NOCYCLE

78
© Dipl.Ing.-Paul Panhofer Bsc.

37 -- bestimmt, ob nach Erreichen des MAXVALUE .


38 -- bzw. MINVALUE zyklisch weiter vergeben wird
39

40 CACHE int|NOCACHE
41 -- bestimmt, wie viele Schluesselwerte im
42 -- Hauptspeicher bereitgestellt werden.
43 -- Bei NOCACHE werden keine Werte
44 -- vorgehalten

 DDL: create sequence 


1 -- ----------------------------------------
2 -- Beispiele: Sequenzen anlegen
3 -- ----------------------------------------
4 CREATE SEQUENCE project_seq INCREMENT BY 1
5 STARTS WITH 1
6 NOMAXVALE
7 NOCYCLE
8 CACHE 10;

7.6.2 Sequenzen verwenden

Für das Arbeiten mit Sequenzen verwenden wir die


Attribute curval und nextval.

 DDL: Sequenzen verwenden 


1 -- ----------------------------------------
2 -- Sequenzen verwenden
3 -- ----------------------------------------
4 INSERT INTO projects values
5 (project_seq.NEXTVAL, ’Simulation’);
6

7 -- Gegenwaertigen Wert der Sequenz abfragen


8 project_seq.CURVAL
9

10 -- Naechsten Wert der Sequenz abfragen


11 project_seq.NEXTVAL

79
Informationssysteme

8. SQL - Data Manipulation Language 8.1. DML - Befehlssatz 

L Data Manipulation Language 


Die Data Manipulation Language definiert Be-
fehle zur Verarbeitung von Daten.

8.1.1 DML Befehlssatz

Der DML Befehlssatz wird zur Verarbeitung von Da-


ten in der Datenbank verwendet.

 Auflistung: DML Befehlssatz 

L insert command 
Die insert Anweisung ist ein Befehl zum Einfü-
gen von Daten in Datenbanktabellen.

Der insert Befehl besitzt mehrere Formen.


01. DML Befehlssatz 80
 update command 
02. Insert Befehl 81
Die update Anweisung ist ein Befehl zum Än-
03. Update Befehl 82 dern von Daten.

Der update Befehle besitzt mehrere Formen.

( merge command 
Die merge Anweisung ist ein Befehl zum Ver-
arbeiten von Daten Die Anweisung ist im Kern
eine Kombination eines insert und update Be-
fehls.

é delete command 
Die delete Anweisung ist ein Befehl zum Lö-
schen von Daten.

80
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 26. DML Befehlssatz

8.2. insert Befehl  8.2.2 insert - select

Die insert Anweisung ist ein Befehl zum Einfügen von Der insert - select Befehl stellt eine Variation des ur-
Daten in die Datenbank. Die SQL Spezifikation unter- sprünglichen insert Befehls dar.
scheidet mehrere Formen des insert Befehls.
Zur Migration von Daten ist es möglich den insert
Befehl mit der select Anweisung zu koppeln.
8.2.1 insert Befehl

Befehl zum Einfügen von Datensätzen in die Daten-  DML: insert - select command 
bank. 1 -- ----------------------------------------
2 -- Syntax: insert select
 DML: insert command 
3 -- ----------------------------------------
1 -- ----------------------------------------
4 INSERT INTO table_name VALUES
2 -- Syntax: insert
5 (column1, column2)
3 -- ----------------------------------------
6 SELECT value1, value2
4 -- Syntax 1
7 FROM table_name;
5 INSERT INTO table_name (column1, column2, )
8
6 VALUES (value1, value2, value3, ...);
9 -- ----------------------------------------
7
10 -- Beispiel: insert - select
8 -- Syntax 2
11 -- ----------------------------------------
9 INSERT INTO table_name
12 INSERT INTO c_projects
10 VALUES (value1, value2, value3, ...);
13 VALUES (
11
14 project_description,
12 -- ----------------------------------------
15 project_title,
13 -- Beispiel: insert
16 project_id,
14 -- ----------------------------------------
17 is_fwf_sponsored,
15 INSERT INTO groups (group_id, name) VALUES
18 is_ffg_spondered
16 (1, ’1 AHIT - 2015’);
19 )
17
20 SELECT id, title, description, fwf
18 INSERT INTO subjects VALUES
21 FROM l_projects
19 (1, ’Systemtechnik - Informationssysteme’);
22 WHERE project_type = ’REQUEST_FUNDING’;

q
q

81
Informationssysteme

8.3. update Befehl  .

Die update Anweisung ist ein Befehl zum Ändern von


Daten.

8.3.1 update syntax

Die SQL Spezifikation definiert mehrere Formen des


update Befehls.

 DML: update Syntax 


1 -- ----------------------------------------
2 -- Syntax: update
3 -- ----------------------------------------
4 -- Andern aller Werte einer Tabelle
5 UPDATE table_name
6 SET column1 = value1, column2 = value2, ...;
7

8 -- Andern bestimmte Werte in der Tabelle


9 UPDATE table_name
10 SET column1 = value1, column2 = value2, ...
11 WHERE predicate;

 DML: Fallbeispiel Schule 


1 -- ----------------------------------------
2 -- Beispiel: update
3 -- ----------------------------------------
4 UPDATE students SET last_name = ’Lang’
5 WHERE student_id = 1;
6

7 UPDATE students
8 SET last_name, = ’Dreger’,
9 first_name = ’Nikolaus’
10 WHERE student_id = 3
11

12 UPDATE employees
13 SET salary = (
14 SELECT avg(salary) FROM employees
15 )
16 WHERE department_id = 103;
17

18 UPDATE employees
19 SET salary = (
20 SELECT max(salary) FROM employees
21 )
22 WHERE department_id IN (
23 SELECT
24 )

82
© Dipl.Ing.-Paul Panhofer Bsc.

. .

83
Informationssysteme

9. SQL - Data Control Language 9.1. DCL Befehle 

L Data Control Language 


Die DCL definiert Befehle zum Vergeben und
Entziehen von Berechtigungen.

DCL ist die Datenüberwachungssprache relationa-


ler Datenbanken.

9.1.1 DCL Befehlssatz

Der DCL Befehlssatz definiert Befehle zur Verwaltung


von Benutzerrechten für die Datenbank.

 Auflistung: DCL Befehlssatz 

g create user 
Befehlsgruppe zum Anlegen von Benutzern.

01. DCL Befehlssatz 84


3 grant 
02. create User 84 Befehlsgruppe zum Zuordnen von Benutzer-
rechten.
03. grant 85

Y revoke 
Befehlsgruppe zum Zurücknehmen von Benut-
zerrechten

9.2. create user Befehl 


Befehlsgruppe zum Anlegen und Verwalten von Be-
nutzern.

9.2.1 Benutzerverwaltung

Die Benutzerverwaltung ist der Steuerungsprozess,


welche Benutzer sich mit der Datenbank verbinden
dürfen und welche Rechte sie für die Datenbank ha-
ben.

Für ein Unternehmen wäre es schwer ein Sicherheits-


system für seine Anwendungen zu implementieren,
wenn die Datenbank keine Möglichkeit für die Durch-
setzung von Benutzerrechten bieten würde.
q

84
© Dipl.Ing.-Paul Panhofer Bsc.

user IP Adresse Passwort


CREATE USER ’htl-administrator’@’localhost’ IDENTIFIED BY ’htl-pa33w09d’
create user Befehl

Abbildung 27. create user Befehl

9.2.2 create User Befehl 9.3. grant Befehl 


Der create user Befehl besteht aus mehreren Seg-
Befehlsgruppe zum Zuordnen von Benutzerrechten.
menten.

 Erklärung: Segmente create user 


9.3.1 Privilegien zuordnen
‚ Schlüsselwörter: Die Schlüsselwortsegmente create
user und identified by trennen das Benutzerseg- Damit ein Benutzer bestimmte Aktionen in der Da-
ment vom Passwortsegment. tenbank ausführen kann werden ihm Privilegien zuge-
ordnet.
‚ Benutzername: Das Benutzernamesegment besteht
aus 2 Teilen: Dem Namen des Benutzers und der IP
 Auflistung: Privilegien 
Adresse des Hosts von dem er sich verbindet.
‚ create: Erlaubt einem Benutzer, neue Tabellen zu
‚ Passwort: Das Passwortsegment dient zur Angabe erstellen.
des Passworts des Benutzers.
‚ delete: Erlaubt einem Benutzer, Zeilen in einer Ta-
belle zu löschen.
 DCL: Benutzerverwaltung 
1 -- ---------------------------------------- ‚ insert: Erlaubt einem Benutzer, neue Zeilen in eine
2 -- Syntax: create User Tabelle zu schreiben.
3 -- ---------------------------------------- ‚ select: Leseberechtigungen auf eine Datenbank
4 -- Anlegen des users htl-admin oder Tabelle.
5 create user ’htl-admin’@’127.0.0.1’
6 identified by ’htl-12345’; ‚ update: Erlaubnis eine Zeile zu aktualisieren.
7
‚ all privileges: Ein Wildcard für alle Rechte auf das
8 create user ’htl-admin’@’%’ gewählte Datenbankobjekt.
9 identified by ’htl45’;
10 q
11 -- Benutzer anzeigen
12 select * from mysql.user;
13

14 -- ----------------------------------------
15 -- Syntax: mysqladmin
16 -- ---------------------------------------- 9.3.2 Syntax: grant Befehl
17 -- Aendern des Passworts des Admins
18 mysqladmin --user=root  DCL: Rechteverwaltung 
19 --password=old 1 -- ----------------------------------------
20 password new 2 -- Syntax: grant
21 3 -- ----------------------------------------
22 -- ---------------------------------------- 4 -- Anatomie des grant Befehls
23 -- Syntax: drop user 5 GRANT privilege ON table_name TO user@host
24 -- ----------------------------------------
25 drop user user_name;
q

85
Informationssysteme

9.3.3 grant Befehl .

 DCL: Rechteverwaltung 
1 -- ----------------------------------------
2 -- Syntax: grant
3 -- ----------------------------------------
4 -- Tabellen fuer Datenbank erstellen
5 GRANT create ON projects.* to
6 ’htl-admin’@’localhost’;
7

8 -- Tabellen auslesen
9 GRANT select ON projects.subprojects to
10 ’htl-admin’@’localhost’;
11

12 -- Alle Rechte fuer eine Datenbank zuordnen


13 GRANT all privileges ON projects.* to
14 ’htl-admin’@’localhost’;
15

16 -- ----------------------------------------
17 -- Rechte anzeigen
18 -- ----------------------------------------
19 SHOW GRANTS FOR ’htl-admin’@’localhost’;
20

21 -- ----------------------------------------
22 -- Rechte zuordnen
23 -- ----------------------------------------
24 FLUSH PRIVILEGES;
25

26 -- ----------------------------------------
27 -- Rechte zuruecknehmen
28 -- ----------------------------------------
29 REVOKE select ON projects.subprojects FROM
30 ’htl-admin’@’localhost’;

86
Informationssysteme - Theorieskriptum
.

Programmierung relationaler Daten-


banken
Version 1.0
Informationssysteme

10. PL/SQL - Grundlagen 10.1. PL/SQL Grundlagen 

L Informationssysteme 
Informationssysteme sind Softwaresysteme zur
Verwaltung von Daten.

L | 
10.1.1 Informationssysteme

Heutige Unternehmen setzten zur Bewältigung ihrer


Planungs- und Steuerungsaufgaben auf komplexe In-
formationssysteme.

Im Sprachgebrauch werden Informationssysteme


auch als Datenbanksysteme bezeichnet.

 Erklärung: Informationssysteme 

01. PL/SQL Grundlagen 88


‚ Die primäre Aufgabe industrieller Informationssys-
teme ist es Datenbestände zu verwalten.

02. PL/SQL Block 92 Informationssysteme werden mit dem Anspruch ent-


wickelt Daten effizient und konsitent verarbeiten
bzw. abfragen zu können.

‚ Informationssysteme ermöglichen es komplexe Da-


tenabfragen auf einfache Weise durchzuführen.
Datenbanken speichern Daten verteilt auf interne
Strukturen. Relationale Datenbanken speichern Da-
ten verteilt auf Tabellen. Jede Tabelle für sich re-
präsentiert einen Aspekt der Gesamtinformation.
Abfragen in Informationssystemen erlauben es die
Aspekte der Geschäftsprozesse zu neuer Informati-
on zusammenzustellen.

‚ Die Implementierung von Geschäftsprozessen ist in


Informationssystemen nur beschränkt möglich. Zur
Programmierung von Geschäftsprozessen werden in
der Regel Applicationskontainer wie der Apache
Webserver4 bzw. Apache Tomcat5 eingesetzt.

‚ PL/SQL stellt eine Erweiterung von Sql dar, die


es ermöglicht mit SQL funktional zu programmie-
ren. Damit können Teile der Anwendungsprogram-
mierung in den Datenbankserver verlagert werden.

4
PHP
5
Java

88
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 28. PlSql Ausführung

10.1.2 PL/SQL 10.1.3 Einsatzgebiete von PL/SQL

PL/SQL stellt eine prozedurale Erweiterung von PlSql erfüllt eine Reihe von Aufgaben in der Anwen-
SQL dar. dungsprogrammierung.

PlSql ermöglicht es Teile der Anwendungslogik vom  Auflistung: Einsatzgebiete von PL/SQL 
Applikationsserver in den Datenbankserver zu ver-
lagern. 3 Datenbankfunktionalität 
 Erklärung: plsql  Mit Plsql Funktionen kann die Sql Sprachspezi-
‚ PlSql kombiniert den SQL Befehlssatz mit Struk- fiktion um neue Funktionen erweitert werden.
turen zur Entscheidungsfindung und Schleifenkon-
strukten. Damit ist es möglich Teile der Anwen- ( Datenkonsistenz 
dungslogik vom Applikatonsserver auf den Daten-
bankserver zu verlagern. Die Sicherstellung der Konsistenz des Daten-
bestandes gehört zu den grundlegenden Auf-
‚ Mit dem Verlagern von Teilen der Anwendungslogik gaben eines Informationssystems. Mit Plsql Pro-
auf den Datenbankserver kann die Verarbeitungsge- grammen kann die logische Konsistenz der
schwindigkeit einer Anwendung siginifikant gestei- Daten auf einfache Weise sichergestellt wer-
gert werden. den.
‚ Die Integration des SQL Befehlssatz in die PlSql
Sprachspezifikation erlaubt Plsql Programmen einen
 Datensicherheit 
einfachen Zugriff auf die Daten einer Datenbank.
Plsql kann zur Programmierung von Authorisie-
‚ Plsql wird heute in erster Line für die Program-
rungskonzepten in der Datenbank verwendet
mierung von Migrationsprozessen, dem Reporting
werden.
bzw. zur Erweiterung des SQL Befehlssatzes verwen-
det.

‚ Bestimmte Anwendungen werden zur Gänze mit


Plsql im Datenbankserver porgrammiert.

89
Informationssysteme

Abbildung 29. Kontextswitch pl/sql Engine

10.1.4 PL/SQL Engine


r Datenzugriff 
Zur Ausführung von Plsql Code verwendet der Daten-
Unterliegt die Verarbeitung von Daten einer
bankserver ein eigenes Programm, die Plsql Engine.
komplexen Geschäftslogik, muß der direkte
Die Plsql Engine ist ein hochoptimiertes Programm
Zugriff auf den Datenbestand gesperrt wer-
zum Ausführen von Plsql Code.
den.

Der Zugriff auf die Daten erfolgt dann über Pls-  Erklärung: pl/sql Engine 
ql Prozeduren. ‚ Plsql ist eine prozedurale Programmiersprachen. Im
Gegensatz zu anderen Programmiersprachen kann
PlSql nur im Datenbankserver eingesetzt werden.
3 Datenmigration 
‚ Zur Ausführung von Plsql Code verwendet der Da-
Einer der wichtigsten Anwendungsfälle von tenbankserver ein eigenes Programm, die Plsql En-
PlSQL ist die Programmierung von Daten- gine.
migrationsprozessen. Bei der Datenmigration
werden Daten aus einem Datenbanksche- ‚ Plsql Programme bestehen aus PlSql Anweisungen
ma in ein anderes Datenbankschema über- und SQL Befehlen.
tragen. ‚ Kommt es infolge der Ausführung eines PlSql Pro-
gramms zum Aufruf eines SQL Befehls wird der Be-
 Anwendungsentwicklung  fehl zur Ausführung an den SQL Statement Exe-
cutor weitergeleitet.
Der Fokus vieler Anwendungen liegt auf der
Datenerfassung bzw. Datenpräsentation. An- ‚ Der Aufruf des SQL Statement Executors wird als
Kontextswitch bezeichnet. Ein Kontextswitch ist
wendungen dieser Art können komplett in PlS-
QL programmiert werden. mit einem gewissen Ressourcenaufwand verbunden.

q q

90
© Dipl.Ing.-Paul Panhofer Bsc.

10.1.5 Fallbeispiel: PL/SQL Programm  Erklärung: Variablen 


‚ Plsql unterstützt alle in Oracle SQL definierten Da-
Plsql ist eine blockorientierte Programmiersprache.
tentypen.

‚ Die Variablendeklaration erfolgt in einem dafür


vorgesehenem Teil des Plsql Blocks - dem Dekla-
rationsteil.

‚ Beachten Sie dass bei der Variablendeklaration zu-


erst der Name der Variable, gefolgt vom Datentyp
der Variable angegeben wird.

‚ Der := Operator führt eine Wertzuweisung innerhalb


eines PlSql Programms durch.

 Codebeispiel: Variablendeklaration 
 Erklärung: PL/SQL Block  1 -- ----------------------------------------
‚ Der grundlegende Baustein eines PlSql Programms 2 -- Codebeispiel: Variablendeklaration
ist der PL/SQL Block. 3 -- ----------------------------------------
4 SET SERVEROUTPUT ON;
‚ Plsql Blöcke erfüllen in Plsql Programmen 2 grund-
5
legende Aufgaben:
6 DECLARE
‚ Codestrukturierung: Plsql Blöcke werden zur 7 l_first_name VARCHAR2(50) := ’Denzel’;
Strukturierung von Plsql Code verwendet. 8 l_last_name VARCHAR2(50) := ’Washington’;
‚ Programmausführung: Plsql Blöcke können von 9 l_email VARCHAR2(50) := ’d.washington’;
der Plsql Engine ausgeführt werden. 10 l_phone VARCHAR2(50) := ’0664/3234032’;
11 l_web VARCHAR2(50) := ’http://www...’;
12 l_height NUMBER := 1.76;
 Syntax: Anonymer Block  13 l_weight PLS_INTEGER := 75;
1 -- ---------------------------------------- 14 l_age PLS_INTEGER := 34;
2 -- Syntax: Anonymer Block 15 BEGIN
3 -- ---------------------------------------- 16 DBMS_OUTPUT.PUT_LINE(
4 BEGIN 17 ’person data: ’
5 Executable Statements 18 || l_first_name
6 ... 19 || ’ ’
7 END; 20 || l_last_name
8 21 || ’ ’
9 -- ---------------------------------------- 22 || l_email
10 -- Codebeispiel: Block 23 || ’ ’
11 -- ---------------------------------------- 24 || l_phone
12 BEGIN 25 || ’ ’
13 DBMS_OUTPUT.PUT_LINE(’Hello World’); 26 || l_web
14 END; 27 || ’ ’
15 28 || l_height
16 BEGIN 29 || ’ ’
17 FOR counter in 1..10 LOOP 30 || l_weight
18 DBMS_OUTPUT.PUT_LINE(counter); 31 || ’ ’
19 END LOOP; 32 || l_age
20 END; 33 );
34 END;

91
Informationssysteme

Abbildung 30. Aufbau eines plsql Blocks

10.2. PL/SQL Block  ‚ Fehlerbehandlungsteil: Der Fehlerbehandlungsteil


ist ein optionaler Teil eines Plsql Blocks. Der
10.2.1 Grundgerüst: PL/SQL Block Fehlerbehandlungsteil wird durch das Schlüsselwort
exception eingeleitet.

L PL/SQL Block  Tritt im Ausführungsteil eines PlSql Blocks ein Feh-


ler auf, verzweigt die Ausführung des Plsql Pro-
Ein Plsql Block ist der grundlegende Baustein gramm in den Fehlerbehandlungsteil des Blocks.
eines Plsql Programms:
 Codebeispiel: Anonymer Block 
‚ Plsql Blöcke definieren einen Rahmen in 1 -- ----------------------------------------
dem Variablen gelten. 2 -- Syntax: Anonymer Block
‚ Plsql Blöcke dienen zur Kapselung von Plsql 3 -- ----------------------------------------
Anweisungen. 4 DECLARE
5 Declaration Statements
6 BEGIN
Der Plsql Block ist der grundlegende Baustein eines
7 Executable Statements
Plsql Programms.
8 EXCEPTION
9 Exception handling Statements
 Erklärung: Aufbau eines PL/SQL Blocks 
10 END
‚ Deklarationsteil: Der Deklarationsteil ist ein op- 11
tionaler Teil eines Plsql Blocks. Im Deklarations- 12 -- ----------------------------------------
teil werden Variablen und Strukturen definiert. 13 -- Codebeispiel: Block
Der Deklarationsteil wird über die Schlüsselwörter 14 -- ----------------------------------------
declare bzw. is oder as eingeleitet. 15 DECLARE
‚ Ausführungsteil: Der Ausführungsteil ist ein obli- 16 l_index1 NUMBER DEFAULT 10;
gatorischer Teil eines Plsql Blocks. Im Ausführungs- 17 BEGIN
teil wird die eigentliche Funktionalität eines Plsql 18 ...
Programms implementiert. 19 EXCEPTION
20 ...
Der Ausführungteil wird durch das Schlüsselwort 21
begin eingeleitet. 22 END;

92
© Dipl.Ing.-Paul Panhofer Bsc.

Baustein Beschreibung Vorkommen

Deklarationsteil Im Deklarationsteil werden Variablen und Strukturen definiert optional


Ausführungsteil Im Ausführungsteil wird die eigentiliche Funktionalität des Blocks obligatorisch
implementiert
Fehlerbehandlungsteil Im Fehlerbehandlungsteil wird die Fehlerbehandlung implementiert. optional

Abbildung 31. Teile eines plsql Blocks

10.2.2 Schachtelung von Blöcken 10.2.3 Arten von Blöcken in PL/SQL

Plsql Blöcke können ineinander verschachtelt werden. Die Plsql Spezfikation differenziert mehrere Typen von
Plsql Blöcken.
 Erklärung: Schachteln von Blöcken 
 Auflistung: Arten von Blöcken 
‚ Bei der Verarbeitung von Daten innerhalb von
Schleifen tritt oft eine Schachtelung von Blöcken auf.
| Package Block 
‚ Tritt beim Ausführen einer Schleife ein Fehler auf
Ein Package ist ein Blocktyp zur Kapselung von
wird der Schleifendurchlauf abgebrochen und die
Prozeduren, Funktionen bzw. Variablen. Ein Pls-
Plsql Engine verzweigt in den Fehlerbehandlungs-
ql Programm ist ein Verbund mehrerer Packa-
teil.
ges.
‚ Durch das Einbetten eines Blocks innerhalb einer
Schleife, führt das Auftreten eines Fehlers nicht Packages werden zur Strukturierung von Plsql
notwendigerweise zum Abbruch des Schleifendurch- Code verwendet.
laufs.
‚ In einem eingebetteten Block, kann beim Auftreten 2 Prozedur Block 
eines Fehlers, der Fehler gezielt behandelt werden. Prozeduren sind Plsql Unterprogramme. Proze-
Das Programm kann anschließend mit der Schlei- duren stellen die einfachste Möglichkeit dar
fenverarbeitung fortsetzen. Plsql Code zu strukturieren.

 Codebeispiel: Schachteln von Blöcken 


1 -- ---------------------------------------- 3 Funktion Block 
2 -- Schachteln von Bloecken Plsql Funktionen sind Prozeduren die einen
3 -- ---------------------------------------- Rückgabewert definieren.
4 DECLARE
5 -- Deklarationsteil
6 BEGIN ( Trigger Block 
7 -- Eingebetter Block
Ein Trigger ist ein Plsql Block dessen Ausführung
8 BEGIN
durch ein datenbankinternes Ereignis ange-
9
stossen wird.
10 EXCEPTION
11 -- Fehlerbehandlungsteil
12 END; L anonymer Block 
13

14 EXCEPTION In einem anonymen Block können Prozeduren


15 -- Fehlerbehandlungsteil bzw. Funktionen in einem exklusiven Kontext
16 END; ausgeführt werden.

q q

93
Informationssysteme

11. PL/SQL - Datentypen 11.1. Variablen in PL/SQL 

L Definition von Variablen 


Variablen müssen in PlSql Programmen vor ih-
rer Verwendung im Deklarationsteil eines PlSql
Blocks deklariert werden.

11.1.1 Definition von Variablen

Eine Variable wird deklariert indem ihr Name gefolgt


von einem Datentyp definiert werden.

 Erklärung: Definition von Variablen 


‚ Variablen können direkt bei ihrer Deklaration initia-
lisiert werden.

‚ Variablen werden mit dem Zuweisungsoperators ∶=


bzw. dem Schlüsselwort default initialisiert.

01. Variablen in PL/SQL 94  Codebeispiel: Definition von Variablen 


1 -- ----------------------------------------
02. Skalare Datentypen 96 2 -- Definition von Variablen
3 -- ----------------------------------------
03. Data Dictionary 99 4 DECLARE
5 -- Deklarationsteil eines anonymen Blocks
6 -- Definition einer Variable
04. Record 99
7 -- Name: l_tax_rate
8 -- Typ: NUMBER
05. Virtuelle Tabellen 100
9 l_tax_rate NUMBER;
10

11 -- Definition und Initialisierung


12 -- Name: l_index_high
13 -- Typ: NUMBER
14 -- Initialisierungswert: 10
15 l_index_high NUMBER DEFAULT 10;
16

17 -- Definition einer Konstante


18 -- Name: l_day_amount
19 -- Typ: NUMBER
20 -- Wert: 30
21 l_day_amount CONSTANT NUMBER DEFAULT 30;
22 BEGIN
23 DBMS_OUTPUT.PUT_LINE(
24 ’data output: ’ ||
25 l_tax_rate
26 );
27 END;

94
© Dipl.Ing.-Paul Panhofer Bsc.

11.1.2 Gültigkeitsbereich von Variablen 11.1.3 Qualifier

Variablen gelten im Plsql Block indem sie definiert wer-


den. L Qualifier 

 Erklärung: Gültigkeitsbereich von Variablen  Ein Qualifier ist eine logische Referenzen auf
einen Plsql Block. Der Qualifier entspricht da-
‚ Überdecken sich die Gültigkeitsbereiche zweier Va-
bei dem Namen eines Blocks.
riblen innerhalb eines Plsql Blockes, gilt die Varia-
ble, die im inneren der Blöcke definiert worden ist. Der Zugriff auf einen Qualifier erfolgt über den Na-
‚ Zur Differenzierung von Variablen mit gleichem Na- men des Plsql Blocks.
men, werden Qualifier verwendet.
 Codebeispiel: Qualifier 
‚ Ein Qualifier ist eine logische Referenz auf einen Pls- 1 -- ----------------------------------------
ql Block. 2 -- Qualifier
3 -- ----------------------------------------
 Codebeispiel: Gültigkeitsbereich 
4 PACKAGE BODY project
1 -- ----------------------------------------
5 IS
2 -- Gueltigkeitsbereich von Variablen
6 PROCEDURE init (p_type in varchar2) IS
3 -- ----------------------------------------
7 l_count PLS_INTEGER DEFAULT 0;
4 DECLARE
8 BEGIN
5 l_my_test varchar2(20) := ’Willi Mueller’;
9 DECLARE
6 BEGIN
10 l_inner NUMBER;
7 DECLARE
11 BEGIN
8 l_my_test varchar2(20);
12 SELECT count(title)
9 BEGIN
13 INTO local_block.l_inner
10 l_my_test := ’Alfred Peter’;
14 FROM projects
11 DBMS_OUTPUT.PUT_LINE(
15 WHERE project_type = p_type;
12 l_my_test
16
13 );
17 init.l_count := local_block.l_inner;
14 END;
18 END local_block;
15
19
16 DBMS_OUTPUT.PUT_LINE(
20 project.g_project_count := init.l_count;
17 l_my_test
21 END init;
18 );
22
19 END;
23 END project;

q q

95
Informationssysteme

11.1.4 Arten von Datentypen 11.2. Skalare Datentypen 


Die Plsql Spezifikation definiert mehrere Arten von Da-
tentypen.
L Skalare Datentypen 
 Auflistung: Arten von Datentypen 
Skalare Datentypen werden zur Speicherung
elementarer Datenwerte verwendet.
n SQL Datentypen 
Alle in der SQL Spezifikation definierten Daten- Für Skalare Datentypen unterscheidet die Sql Spe-
typen können in PlSql Programmen verwendet zifikation 4 Kategorien.
werden.  Auflistung: Kategorien 
‚ Numerische Datentypen: Numerische Datentypen
n PL/SQL Datentypen  kommen bei der Verarbeitung von Zahlenwerten
zum Einsatz.
Die PlSql Spezifikation definiert eine Reihe ei-
gener Datentypen. ‚ Alphanumerische Datentypen: Alphanumerische
Datentypen kommen bei der Verarbeitung von Zei-
chenketten zum Einsatz.
 Data Dictionary 
‚ Zeitbezogene Datentypen: Zeitbezogene Datenty-
Die PlSql Spezifikation erlaubt den direkten Zu- pen kommen bei der Verarbeitung von Datumswer-
griff auf die Zeilen- bzw. Spaltentypen der in ten zum Einsatz.
der Datenbank definierten Strukturen.
‚ Boolsche Datentypen: Eine boolsche Variable wird
verwendet um Wahrheitswerte zu verarbeiten.
( Records 
q
Strukturierte Datentypen werden in Plsql als
Records bezeichnet. Strukturierte Datentypen
11.2.1 Numerische Datentypen
werden verwendet um Datensätze zu verwal-
ten. Numerische Werte: Number ist der grundlegende Da-
tentyp zur Verwaltung numerischer Datenwerte.
 Nested Tables 
 Codebeispiel: Numerische Datentypen 
Nested Tables entsprechen den Collections 1 -- ----------------------------------------
anderer Programmiersprachen wie Arrays, Lis- 2 -- Datentyp: numerische Werte
ten bzw. Maps 3 -- ----------------------------------------
4 DECLARE
q 5 l_weeks_to_pay NUMBER(2) := 52;
6 l_raise_factor NUMBER := 0.05;
7 l_salery NUMBER(2,9) := 1234567.89;
8 l_factor NATURAL DEFAULT 0;
9 BEGIN
10 DBMS_OUTPUT.PUT_LINE(
11 l_weeks_to_pay
12 || chr(13)
13 || l_raise_factor
14 || chr(13)
15 || l_salaray
16 || l_factor
17 );
18 END;

96
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 32. Typen von Datentypen

 Codebeispiel: Precision und Scale  11.2.2 Alphanumerische Datentypen


1 -- ----------------------------------------
Alphanumerische Datentypen kommen bei der Verar-
2 -- Datentyp: Precision und Scale
beitung von Zeichenketten zum Einsatz.
3 -- ----------------------------------------
4 DECLARE Verwendent Sie den VARCHAR2 Datentyp zur Verar-
5 v1_nr NUMBER(10) := 2.567; beitung von Zeichenketten in PlSql.
6 v2_nr NUMBER(5,2) := 123.567;
7 v3_nr NUMBER := 2/3;  Auflistung: PL/SQL Datentypen 
8 v4_nr NUMBER(5,2) := 2/3;
9
‚ Zeichenketten - Char: Datentypen zur Verwaltung
alphanumerischer Werte, besitzen 2 Ausprägungen:
10 v5_nr PLS_INTEGER := 201;
Datentypen mit einer variablen und Datentypen mit
11 v6_nr BINARY_FLOAT := 323.332;
einer festgelegten Länge.
12 v7_nr BINARY_DOUBLE := 323321.32
13 BEGIN Char6 ist ein Datentyp mit festgelegter Länge. Bei
14 DBMS_OUTPUT.PUT_LINE( einem Datentyp mit festgelgter Länge wird die ge-
15 v1_nr speicherte Zeichenkette solange mit Leerzeichen auf-
16 || v2_nr gefüllt bis die Zeichenkette die in der Varaiblendefi-
17 || v3_nr nition angegebene Länge hat.
18 || v3_nr * 3
19 || v4_nr * 3 ‚ Zeichenketten - Varchar2: Varchar2 ist ein Daten-
20 ); typ mit variabler Länge. Zeichenketten die einer
21 END; Variable eines Datentyps variabler Länge zugeord-
22 net werden benötigen in der Datenbank genauso viel
23 -- Ausgabe Platz wieviele Zeichen sie beinhalten.
24 v1_nr: 3
Varchar2 ist der wichtigste Datentyp zur Verarbei-
25 v2_nr: 123,57
tung von Zeichenketten.
26 v3_nr: 2
27 v4_nr: 2.01 q
28 v5_nr: 201
29 v6_nr: 323.332
30 v7_nr: 323321.32

6
Char ist ein veralteter Datentyp und hat in der PlS-
q
QL Programmierung keine Bedeutung mehr.

97
Informationssysteme

Datentyp Beschreibung Zuordnung

NUMBER Numerischer Datentyp zur Verwaltung von Gleitkommazahlen Double


NUMBER(10) Numerischer Datentyp zur Verwaltung ganzzahliger Zahlenwerte - 10 stelliger Integer
Integer
NUMBER(2,9) Numerischer Datentyp zur Verwaltung von Fixpunktzahl. - Fixpunktzahl mit 7 Float
Stellen vor dem Komma und 2 Stellen nach dem Komma.
PLS_INTEGER Numerischer Datentyp zur Verwaltung von ganzzahligen Zahlenwerten. Integer
PLS_INTEGER ist ein PLSQL interner Datentyp. PLS_INTEGER ist ein binärer Da-
tentyp der weniger Platz beansprucht und schneller verarbeitet werden kann
als NUMBER.
NATURAL Numerischer Datentyp zur Verwaltung von ganzzahligen positiven Zahlenwer- positive Integer
ten bzw. dem null Wert. Natural ist PLSQL interner Datentyp.
BINARY_FLOAT Numerischer Datentyp zur Verwaltung von Fixkommazahlenwerten. Float
BINARY_FLOAT ist ein PLSQL interner Datentyp. BINARY_FLOAT ist ein binärer
Datentyp der weniger Platz beansprucht und schneller verarbeitet werden
kann als NUMBER.
BINARY_DOUBLE Numerischer Datentyp zur Verwaltung von Fixkommazahlenwerten. Double
BINARY_DOUBLE ist ein PLSQL interner Datentyp. BINARY_FLOAT ist ein binärer
Datentyp der weniger Platz beansprucht und schneller verarbeitet werden
kann als NUMBER.

VARCHAR(255) Alphanumerischer Datentyp zur Verwaltung von Zeichenketten. Zeichenket- String


ten die einer Variable eines Datentyps mit variabler Länge zugeordnet wer-
den nehmen bei der Speicherung genauso viel Platz ein wieviele Zeichen sie
beinhalten.
CHAR(100) Alphanumerischer Datentyp zur Verwaltung von Zeichenketten. Char ist ein String
Datentyp mit festgelegter Länge. Bei einem Datentyp mit festgelgter Länge
wird die gespeicherte Zeichenkette solange mit Leerzeichen aufgefüllt bis die
Zeichenkette die in der Varaiblendefinition angegebene Länge hat.
VARCHAR(255) Alphanumerischer Datentyp zur Verwaltung von Zeichenketten. Zeichenket- String
ten die einer Variable eines Datentyps mit variabler Länge zugeordnet wer-
den nehmen bei der Speicherung genauso viel Platz ein wieviele Zeichen sie
beinhalten.

DATE Datentyp zur Verwaltung von zeitbezogenen Daten Date


TIMESTAMP Datentyp zur Verwaltung von zeitbezogenen Daten Date

BOOLEAN Datentyp zur Verwaltung von boolschen Wahrheitswerten Boolean

Abbildung 33. Skalare Datentypen

. .

98
© Dipl.Ing.-Paul Panhofer Bsc.

11.3. Data Dictionary  11.4. Strukturierte Datentypen 

11.3.1 Data Dictionary


L Record 
Mit dem Data Dictionary erlaubt die Plsql Spezifikati-
Ein Record ist ein Datentyp zur Verwaltung
on eine implizite Referenzierung der Zeilen- bzw. Spal-
strukturierter Daten.
tentypen von Datenbankartefakten bei der Deklarati-
on von Variablen.
11.4.1 Record - Strukturierter Datentypen

Ein Record ist ein Datentyp zur Verwaltung struktu-


rierter Daten.
 Erklärung: Komplexe Datentypen 
‚ Records werden zur Speicherung von Datensätzen
verwendet.
‚ Zum Zugriff auf die Felder eines Records wird der
Punktoperator verwendet.

 Analyse: Data Dictionary   Codebeispiel: Record 


‚ Das Data Dictionary erlaubt dem Programmierer 1 -- ----------------------------------------
direkt gegen die Spalten- bzw. Zeilentypen von Ta- 2 -- Datentyp: Record
bellen zu programmieren, ohne den Datentyp bei der 3 -- ----------------------------------------
Definition einer Variable explizit anzugeben zu müs- 4 DECLARE
sen. 5 -- Typdefinition eines Record Datentyps
6 TYPE l_person_rec_t IS RECORD(
‚ Werden Datentypen auf diese Weise definiert, spre- 7 id NUMBER NOT NULL DEFAULT 1,
chen wir von robuster Programmierung. 8 publication_date DATE,
9 first_name EMPLOYEES.FIRST_NAME%TYPE,
 Codebeispiel: Ableiten von Datentypen  10 last_name EMPLOYEES.LAST_NAME%TYPE,
1 -- ---------------------------------------- 11 job_id EMPLOYEES.JOB_ID%TYPE
2 -- Ableiten von Datentypen 12 );
3 -- ---------------------------------------- 13

4 DECLARE 14 -- record variable


5 l_given_name employess.first_name%TYPE; 15 l_person_rec l_person_rec;
6 l_surname employees.last_name%TYPE; 16 BEGIN
7 17 -- Werte in der Record Variable speichern
8 l_person_rec employees%ROWTYPE; 18 l_person_rec.id := 17;
9 BEGIN 19

10 l_given_name := ’Tobias’; 20 SELECT first_name, last_name, job_id


11 l_surname := ’Huber’; 21 INTO l_persont_rec.first_name,
12 22 l_person_rec.last_name,
13 dbms_output.put_line(l_given_name); 23 l_person_rec.job_id
14 dbms_output.put_line(l_surname); 24 WHERE employees_id = l_person_rec.id;
15 25

16 dbms_output.put_line( 26 dbms_output.put_line(
17 ’name: ’ 27 || l_person_rec.id
18 || l_person_rec.first_name 28 || l_person_rec.first_name
19 || l_person_rec.last_name 29 || l_person_rec.last_name
20 ); 30 );
21 END; 31 END;

q q

99
Informationssysteme

11.5. Virtuelle Tabllen  11.5.2 Records in Virtuellen Tabellen

Virtuelle Tabellen können zur Verwaltung von Daten-


L Virtuelle Tabelle  sätzen verwendet werden.

Virtuelle Tabellen werden zur Verwaltung von  Codebeispiel: Virtuelle Tabellen 


Datensätzen verwendet.
1 -- ----------------------------------------
Virtuelle Tabellen sind Tabellenstrukturen die 2 -- Datentyp: Virtuelle Tabellen
im Speicher des Datenbankservers verwaltet 3 -- ----------------------------------------
werden. 4 DECLARE
5 -- DEFINITION: Definition des Typs
Virtuelle Tabellen sind das Gegenstück zu Collecti- 6 -- einer Virtuellen Tabelle
ontypen anderer Programmiersprachen. 7 TYPE PROJECT_TABLE_TYPE IS TABLE OF
8 HR.L_PROJECTS%ROWTYPE;
9

11.5.1 Virtuelle Tabellen 10 -- DEKLARATION: Deklaration einer


11 -- Virtuellen Tabelle im Speicher
Virtuelle Tabellen können zur Verwaltung von skalaren
12 l_projects PROJECT_TABLE_TYPE :=
Werten verwendet werden.
PROJECT_TABLE_TYPE();
13
 Codebeispiel: Virtuelle Tabellen 
14 -- DEFINITION: Definition eines
1 -- ---------------------------------------- 15 -- Recordtyps
2 -- Datentyp: Virtuelle Tabellen 16 TYPE PROJECT_REPORT_TYPE IS RECORD (
3 -- ---------------------------------------- 17 PROJECT_ID HR.L_PROJECTS.ID%TYPE,
4 DECLARE 18 TITLE HR.L_PROJECTS.TITLE%TYPE,
5 -- DEFINITION: Definition des Typs einer 19 COMPLEXITY NUMBER(100)
6 -- Virtuellen Tabelle 20 );
7 TYPE NAME_TABLE_TYPE IS TABLE OF 21
VARCHAR2(100); 22 -- DEFINITION: Definition des Typs
8
23 -- einer Virtuellen Tabelle
9 -- DEKLARATION: Deklaration einer 24 TYPE PR_TABLE_TYPE IS TABLE OF
10 -- virtuellen Tabelle im Speicher PROJECT_REPORT_TYPE;
11 l_names NAME_TABLE_TYPE := NAME_TABLE_TYPE( 25
12 ’Franz’, 26 -- DEKLARATION: Deklaration einer der
13 ’Josef’, 27 -- Virtuellen Tabelle im Speicher
14 ’Daniel’, 28 l_project_reports PR_TABLE_TYPE :=
15 ); PR_TABLE_TYPE();
16 BEGIN 29 BEGIN
17 FOR i in l_names.first..l_names.last 30 SELECT l.*
18 LOOP 31 BULK COLLECT INTO l_projects
19 DBMS_OUTPUT.PUT_LINE(l_names(i)); 32 FROM HR.L_PROJECTS l
20 END LOOP; 33 WHERE l.PROJECT_TYPE = ’STIPENDIUM’;
21 END; 34
22
35 FOR i in l_projects.first..l_names.last
23 -- ---------------------------------------- 36 LOOP
24 -- Ausgabe 37 DBMS_OUTPUT.PUT_LINE(
25 -- ---------------------------------------- 38 || l_projects(i).TITLE
26 Franz 39 );
27 Josef 40 END LOOP;
28 Daniel 41 END;

q q

100
© Dipl.Ing.-Paul Panhofer Bsc.

11.5.3 Arbeiten mit virtuellen Tabellen 11.5.4 DQL: Virtuelle Tabellen

Die Dimension einer Virtuelle Tabelle muß beim De- Zur Verarbeitung Virtueller Tabellen kann in Plsql Blö-
klarieren der Tabelle nicht explizit definiert werden. cken auf die select Anweisung zurückgegriffen werden.

 Erklärung: Virtuelle Tabellen 


L Tabellenverarbeitung 
‚ Mit der SELECT INTO Anweisung kann das Ergebnis
einer Query in einer Virtuellen Tabelle gespeichert Zur Verarbeitung einer Virtuellen Tabellen in ei-
werden. Die Dimension der Virtuellen Tabelle wird ner select Abfrage muß der Typ der Tabelle im
dabei vom Datenbankserver gesetzt. globalen Kontext verfügbar sein.

‚ Werden Datensätze explizit in eine Virtuelle Tabel-


le geschrieben, muß die Größe der Tabelle explizit  Erklärung: select Abfragen 
verwaltet werden. ‚ Der Typ einer Virtuellen Tabelle ist im globalen
Kontext verfügbar, wenn der Typ der Tabelle ein
‚ Durch den Aufruf der extend Prozedur kann die Ka-
globaler Typ ist.
pazität der virtuellen Tabelle explizit verändert wer-
den. ‚ Wird der Typ einer virtuellen Tabelle in der Spezi-
fikation eines Packages definiert ist er im globalen
 Codebeispiel: Virtuelle Tabellen  Kontext verfügbar.
1 -- ----------------------------------------
‚ Durch die Verwendung der table Funktion können
2 -- Virtuelle Tabellen
virtuelle Tabellen in einer select Anweisung verar-
3 -- ----------------------------------------
beitet werden.
4 DECLARE
5 TYPE PROJECT_TABLE_TYPE IS TABLE OF  Codebeispiel: DQL: Virtuellen Tabellen 
HR.C_PROJECTS%ROWTYPE; 1 -- ----------------------------------------
6 2 -- DQL: Virtuelle Tabellen
7 l_projects PROJECT_TABLE_TYPE := 3 -- ----------------------------------------
PROJECT_TABLE_TYPE(); 4 DECLARE
8 p_i PLS_INTEGER DEFAULT 1; 5 l_projects PROJECT_TABLE_TYPE :=
9 PROJECT_TABLE_TYPE();
10 l_project HR.C_PROJECTS%ROWTYPE; 6

11 l_research 7 TYPE PROJECT_REPORT_TABLE_TYPE IS TABLE OF


HR.C_RESEARCH_FUNDING_PROJECT%ROWTYPE; HR.L_PROJECT_REPORT%ROWTYPE;
12 BEGIN 8

13 FOR project IN 9 l_project_reports


14 ( SELECT p.* FROM L_PROJECTS) PROJECT_REPORT_TABLE_TYPE :=
15 LOOP PROJECT_REPORT_TABLE_TYPE();
16 -- Explizite Aenderung der Groesse 10 BEGIN
17 l_projects.EXTEND; 11 SELECT l.*
18 l_projects(p_i).TITLE := project.TITLE; 12 BULK COLLECT INTO l_projects
19 13 FROM HR.L_PROJECTS l
20 IF l_projects(p_i).PROJECT_TYPE = 14 WHERE project_type = ’REQUEST_FUNDING’;
’REQUEST_FUNDING_PROJECT’ 15

21 THEN 16 -- Verwendung der Table Funktion


22 l_research.IS_SMALL_PROJECT := 17 SELECT l.*
l_project(p_i).IS_SMALL_PROJECT; 18 BULK COLLECT INTO l_project_reports
23 END IF; 19 FROM HR.PROJECT_REPORT l JOIN
24 TABLE(l_projects) p
25 p_ := p_i + 1; 20 ON l.PROJECT_ID = p.PROJECT_ID;
26 END LOOP; 21

27 END; 22 END;

q q

101
Informationssysteme

12. PL/SQL - Befehle 12.1. SQL Befehle in PLSQL 


Der SQL Befehlssatz ist Teil der Plsql Spezifikation.

Der SQL Befehlssatz ist in mehrere Kategorien un-


terteilt. Je nach Kategorie wird ein SQL Befehle un-
terschiedlich in einem Plsql Programm aufgerufen.

12.1.1 DQL - Data Query Language

Die select Anweisung kann direkt in Plsql Program-


men aufgerufen werden.

 Erklärung: into Klausel 


‚ Um den select Befehls in Plsql Programmen zu ver-
wenden, muß die Anweisung um die into Klausel
erweitert werden.

‚ Mit der into Klausel wird das Ergebnis einer select


Query in einer Plsql Variable gespeichert.

‚ Setzt sich das Ergebnis einer select Anweisung aus


mehreren Datensätzen zusammen, wird statt der in-
01. SQL Befehle in PL/SQL 102 to Klausel die bulk collect into Klausel eingesetzt.

02. Kontrollstrukturen 105  Codebeispiel: select Befehl 


1 -- ----------------------------------------
03. Schleifenkonstrukte 106 2 -- Befehl: DQL Befehle
3 -- ----------------------------------------
04. Fehlerbehandlung 108 4 DECLARE
5 l_title VARCHAR2(50);
05. Kursor 112 6

7 TYPE PROJECT_TABLE_TYPE IS TABLE OF


06. Transaktionen 114 HR.L_PROJECTS%ROWTYPE;
8

9 l_projects PROJECT_TABLE_TYPE :=
PROJECT_TABLE_TYPE();
10 BEGIN
11 SELECT p.TITLE INTO l_title
12 FROM HR.L_PROJECTS p
13 WHERE p.PROJECT_ID = 123;
14

15 SELECT l.*
16 BULK COLLECT INTO l_projects
17 FORM HR.L_PROJECTS l;
18

19 FOR i IN l_projects.first..l_projects.last
20 LOOP
21 ...
22 END LOOP;
23 END;

102
© Dipl.Ing.-Paul Panhofer Bsc.

12.1.2 DML - Data Manipulation Language 12.1.3 forall Anweisung

DML Befehle können direkt in PL/SQL Programmen Die forall Anweisung erlaubt es mehrere DML Befehle
aufgerufen werden. in eine einzelne Plsql Anweisung einzubetten.

 Codebeispiel: DML Befehle 


 Codebeispiel: forall Syntax 
1 -- ---------------------------------------- 1 -- ----------------------------------------
2 -- Befehl: DML Befehle 2 -- Syntax: forall
3 -- ---------------------------------------- 3 -- ----------------------------------------
4 DECLARE 4 FORALL index IN
5 TYPE PROJECT_TABLE_TYPE IS TABLE OF 5 [ lower_bound .. upper_bound |
HR.L_PROJECTS%ROWTYPE; 6 INDICES OF indexing_collection |
6
7 VALUES OF indexing_collection
7 TYPE REPORT_TABLE_TYPE IS TABLE OF 8 ]
HR.PROJECT_REPORT%ROWTYPE; 9 [ SAVE EXCEPTION]
8
10 sql_statement;
9 l_projects PROJECT_TABLE_TYPE :=
PROJECT_TABLE_TYPE();
10
 Erklärung: forall Anweisung 
11 l_project_report HR.PROJECT_REPORT%ROWTYPE; ‚ Werden DML Befehl innerhalb von Plsql Program-
12 BEGIN men ausgeführt kommt es innerhalb der Plsql Engine
13 zu einem Kontextswitch.
14 SELECT p.*
‚ Kommt es beim Ausführen eines PlSQL Programms
15 BULK COLLECT INTO l_projects
wiederholt zu einem Kontextwechsel, wächst die
16 FROM HR.L_PROJECTS p;
Last auf die Plsql Engine zunehmend.
17

18 -- DML Befehl ‚ Die forall Anweisung wurde konzipiert um eine be-


19 DELETE FROM HR.PROJECT_REPORT; liebige Zahl von DML Befehlen auszuführen, ohne
20 die Last für das Programm zu erhöhen.
21 FOR i in l_projects.first..l_projects.last
22 LOOP  Codebeispiel: forall Beispiele 
23 l_project_report.PROJECT_ID := 1 -- ----------------------------------------
l_projects(i).PROJECT_ID; 2 -- Codebeispiel: FORALL
24 l_project_report.TITLE := 3 -- ----------------------------------------
l_projects(i).TITLE; 4 DECLARE
25 l_project_report.COMPLEXITY := 100; 5 TYPE PROJECT_REPORT_TYPE IS TABLE OF
26
HR.PROJECT_REPORT%ROWTYPE;
27 INSERT INTO HR.PROJECT_REPORT VALUES 6
l_project_report; 7 l_project_reports PROJECT_REPORT_TYPE :=
28 END LOOP; PROJECT_REPORT_TYPE();
29
8 BEGIN
30 SELECT p.* 9 SELECT p.PROJECT_ID, p.TITLE, 0
31 INTO l_project_report 10 BULK COLLECT INTO l_project_reports
32 FROM HR.PROJECT_REPORT p 11 FROM HR.L_PROJECTS p
33 WHERE p.PROJECT_ID = 23; 12
34
13 -- forall Anweisung
35 UPDATE HR.PROJECT_REPORT 14 FORALL i IN l_project_reports.FIRST ..
36 SET COMPLEXTY = 200 l_project_reports.LAST
37 WHERE PROJECT_ID = 23; 15 INSERT INTO HR.PROJECT_REPORT VALUES
38
l_project_reports(i);
39 END; 16 END;

q q

103
Informationssysteme

 Erklärung: returning Klausel   Codebeispiel: SQL Attribute 


‚ DML Anweisungen wie die insert Anweisung haben 1 -- ----------------------------------------
einen Rückgabewert. 2 -- Codebeispiel: SQL Attribute
3 -- ----------------------------------------
‚ Die returning Klausel erlaubt den Zugriff auf den
4 DECLARE
Rückgabewert von DML Befehlen.
5 ...
6 BEGIN
 Codebeispiel: returning Klausel  7 -- Es konnten nicht alle INSERT Befehle
1 -- ---------------------------------------- 8 -- ausgefhrt werden
2 -- Codebeispiel: FORALL RETURNING 9 IF SQL%ROWCOUNT < l_project_reports.LAST
3 -- ---------------------------------------- 10 THEN
4 DECLARE 11 DBMS_OUTPUT.PUT_LINE(’error occured’);
5 TYPE PROJECT_REPORT_TYPE IS TABLE OF 12 END IF;
HR.PROJECT_REPORT%ROWTYPE; 13 END;
6

7 TYPE PROJECT_ID_TYPE IS TABLE OF


q
HR.PROJECT_REPORT.PROJECT_ID%TYPE;
8

9 l_project_reports PROJECT_REPORT_TYPE := 12.1.4 DDL - Data Definition Language


PROJECT_REPORT_TYPE();
DDL Befehle müssen als Parameter der execute im-
10
mediate Operation ausgeführt werden.
11 -- Virtuelle Tabelle zur Speicherung der
12 -- generierten ID
13 l_project_ids PROJECT_ID_TYPE :=  Codebeispiel: DDL Befehle 
PROJECT_ID_TYPE(); 1 -- ----------------------------------------
14 BEGIN 2 -- Befehl: DLL Befehle
15 SELECT p.PROJECT_ID, p.TITLE, 0 3 -- ----------------------------------------
16 BULK COLLECT INTO l_project_reports 4 DECLARE
17 FROM HR.L_PROJECTS p 5 l_is_table_present PLS_INTEGER DEFAULT 0;
18 6 l_c_create_table_ddl VARCHAR2(500) :=
19 -- forall Befehl 7 ’CREATE TABLE PROJECT_REPORT (
20 FORALL i IN l_project_reports.FIRST.. 8 PROJECT_ID INTEGER NOT NULL,
l_project_reports.LAST 9 PRIMARY KEY (PROJECT_ID)
21 INSERT INTO HR.PROJECT_REPORT 10 )’;
22 VALUES l_project_reports(i) 11

23 -- returning Klausel 12 l_c_drop_table_ddl CONSTANT VARCHAR2(500)


24 RETURNING project_id 13 DEFAULT ’DROP TABLE PROJECT_REPORT’;
25 BULK COLLECT l_project_ids; 14 BEGIN
26 15

27 END; 16 SELECT count(l.TABLE_NAME)


17 INTO l_is_table_present
18 FROM USER_TABLES l
 Erklärung: SQL Attribute 
19 WHERE l.TABLE_NAME = ’PROJECT_REPORT’;
‚ SQL Attribute erlauben den direkten Zugriff auf den 20
globalen Datenbankkontext. 21 IF l_is_table_present = 0 THEN
‚ Der Kontext speichert Daten und Informationen 22 EXECUTE IMMEDIATE l_c_drop_table_ddl;
zum Status aller Plsql Programme. 23 END IF;
24
‚ Für die forall Anweisung definiert die Plsql Spezifi- 25 EXECUTE IMMEDIATE l_c_create_table_ddl;
kation eine Reihe von SQL Attributen um den Sta- 26 END;
tus der abgesetzten DML Befehle prüfen zu können.

104
© Dipl.Ing.-Paul Panhofer Bsc.

12.2. Kontrollstrukturen   Codebeispiel: IF THEN ELSE 

Kontrollstrukturen sind Programmierkonstrukte die 1 -- ----------------------------------------


helfen den Fluss eines Programms zu steuern. 2 -- Syntax: IF THEN ELSE
3 -- ----------------------------------------
4 IF condition THEN
5 Statement;
6 ELSE
7 Statement;
8 END IF;
9

10 -- ----------------------------------------
11 -- Beispiel: IF THEN ELSE
12 -- ----------------------------------------
13 DECLARE
Trifft die Bedingung der if Anweisung zu, werden 14 l_num NUMBER := 4;
die Befehle innerhalb des if then Blocks ausgeführt. 15 BEGIN
16 IF MOD(l_num, 2) = 0 THEN
17 DBMS_OUTPUT.PUT_LINE(’number is even’);
12.2.1 IF THEN Block 18 ELSE
19 DBMS_OUTPUT.PUT_LINE(’number is odd’);
 Syntax: IF THEN  20 END IF;
1 -- ---------------------------------------- 21 END;
22
2 -- Syntax: IF THEN
3 -- ---------------------------------------- 23 -- ----------------------------------------
4 IF condition THEN 24 -- Syntax: IF THEN ELSIF
5 Statement1; 25 -- ----------------------------------------
6 ... 26 IF condition THEN
7 StatementN; 27 Statement1;
8 END IF; 28 ELSIF condition2 THEN
29 Statement2;
30 ELSE
 Codebeispiel: IF THEN 
31 StatementN;
1 -- ---------------------------------------- 32 END IF;
2 -- Beispiel: IF THEN 33

3 -- ---------------------------------------- 34 -- ----------------------------------------
4 DECLARE 35 -- Beispiel: IF THEN ELSIF
5 l_number NUMBER := 8; 36 -- ----------------------------------------
6 l_employees_count NUMBER := 0; 37 DECLARE
7 BEGIN 38 l_country VARCHAR2(30) := &user_input;
8 39 BEGIN
9 SELECT count(employees_id) 40 IF l_country = ’Austria’ THEN
10 INTO l_employees_count 41 DBMS_OUTPUT.PUT_LINE(
11 FROM employees; 42 ’A great country: ’ || l_country
12 43 );
13 if l_employees_count THEN 44 ELSIF v_country = ’USA’ THEN
14 DBMS_OUTPUT.PUT_LINE(’Inside the if’); 45 DBMS_OUTPUT.PUT_LINE(
15 END IF; 46 ’An old country: ’ || l_country
16 47 );
17 DBMS_OUTPUT.PUT_LINE(’Outside the if’); 48 END IF;
18 49 END;
19 END;
q

105
Informationssysteme

12.2.2 Kontrollstruktur - Case Block 12.3. Schleifenkonstrukte 


 Erklärung: Case Block 
L Schleifenkonstrukte 
‚ Ein case Block besteht aus mehreren when Blöcken.
Schleifen werden eingesetzt, um Anweisun-
‚ Trifft die Bedingung eines der when Blöcke zu, wer-
gen wiederholt auszuführen.
den die Befehle innerhalb des Blocks ausgeführt.
‚ Wurde der Code innerhalb eines when Blocks ausge- Die Plsql Spezifikation definiert 3 unterschiedliche
führt, verzweigt die Programmausführung zum Ende Schleifenkonstrukte: loop block, while block, for
des Case Blocks. block.

 Syntax: Case Block 


12.3.1 Loop Block
1 -- ----------------------------------------
2 -- Syntax: CASE Block  Syntax: Loop Block 
3 -- ---------------------------------------- 1 -- ----------------------------------------
4 CASE 2 -- Syntax: Loop Block
5 WHEN condition1 THEN 3 -- ----------------------------------------
6 Statement1; 4 LOOP
7 WHEN condition2 THEN 5 Statement1;
8 Statement1; 6 Statement2;
9 END CASE; 7 Statement3;
10
8 ...
11 -- ---------------------------------------- 9 StatementN;
12 -- Beispiel: CASE Block 10 END LOOP;
13 -- ----------------------------------------
14 DECLARE
 Codebeispiel: Loop Block 
15 l_country VARCHAR2(30) := &user_input;
1 -- ----------------------------------------
16 BEGIN
2 -- Beispiel: Loop Block
17 CASE
3 -- ----------------------------------------
18 WHEN l_country = ’Austria’ THEN
4 DECLARE
19 DBMS_OUTPUT.PUT_LINE(’A great country’);
5 l_counter NUMBER := 0;
20 WHEN v_country = ’USA’ THEN
6 l_result NUMBER;
21 DBMS_OUTPUT.PUT_LINE(’An old country’);
7 BEGIN
22 END CASE;
8 LOOP
23 END;
9 IF l_counter > 10 THEN
24
10 EXIT;
25 DECLARE
11 END IF:
26 l_actual_version pls_integer :=
12
dbms_db_version.version;
13 l_counter := l_counter + 1;
27 BEGIN
14 l_result := l_counter * 5;
28 CASE l_actual_version
15
29 WHEN 11 THEN
16 RDBMS_OUTPUT.PUT_LINE(
30 DBMS_OUTPUT.PUT_LINE(’Version 11?’);
17 ’5 * ’
31 WHEN 12 THEN
18 || l_counter
32 DBMS_OUTPUT.PUT_LINE(’aktuelle
19 || ’ = ’
Version?’);
20 || l_result
33 ELSE
21 );
34 DBMS_OUTPUT.PUT_LINE(’Version’);
22
35 END CASE;
23 END LOOP;
36 END;
24 END;

q q

106
© Dipl.Ing.-Paul Panhofer Bsc.

12.3.2 WHILE Block 12.3.3 FOR Block

 Syntax: WHILE Block   Syntax: FOR Block 


1 -- ---------------------------------------- 1 -- ----------------------------------------
2 -- Syntax: WHILE LOOP 2 -- Syntax: FOR LOOP
3 -- ---------------------------------------- 3 -- ----------------------------------------
4 WHILE condition LOOP 4 FOR loop_counter in [REVERSE]
5 Statement1; 5 lower limit .. upper_limit LOOP
6 ... 6 Statement1;
7 StatementN; 7 ...
8 END LOOP; 8 StatementN;
9 END LOOP;
10
 Codebeispiel: WHILE Block 
11 -- ----------------------------------------
1 -- ----------------------------------------
12 -- Syntax: FOR SQL LOOP
2 -- Beispiel: WHILE LOOP
13 -- ----------------------------------------
3 -- ----------------------------------------
14 FOR row IN (sql statement)
4 DECLARE
15 LOOP
5 TYPE PROJECT_TABLE_TYPE IS TABLE OF
16 Statement1;
HR.L_PROJECTS%ROWTYPE;
17 ...
6
18 StatementN;
7 l_projects PROJECT_TABLE_TYPE :=
19 END LOOP;
PROJECT_TABLE_TYPE();
8

9 l_index PLS_INTEGER DEFAULT 1;  Codebeispiel: FOR Block 


10 BEGIN 1 -- ----------------------------------------
11 SELECT l.* 2 -- Beispiel: FOR LOOP
12 BULK COLLECT INTO l_projects 3 -- ----------------------------------------
13 FROM HR.L_PROJECTS l 4 DECLARE
14 WHERE l.PROJECT_TYPE = 5 TYPE PROJECT_TABLE_TYPE IS TABLE OF
’REQUEST_FUNDING_PROJECT’; HR.L_PROJECTS%ROWTYPE;
15 6

16 WHILE l_index < l_index.LAST 7 l_projects PROJECT_TABLE_TYPE :=


17 LOOP PROJECT_TABLE_TYPE();
18 DBMS_OUTPUT.PUT_LINE( 8 BEGIN
19 ’project id: ’ 9 FOR row IN (SELECT p.* FROM HR.L_PROJECTS)
20 || l_projects(l_index).PROJECT_ID 10 LOOP
21 || CHR(13) 11 DBMS_OUTPUT.PUT_LINE( row.PROJECT_ID);
22 || l_projects(l_index).TITLE 12 END LOOP;
23 || CHR(13) 13

24 || l_projects(l_index).DESCRIPTION 14 SELECT l.* BULK COLLECT INTO l_projects


25 || CHR(13) 15 FROM HR.L_PROJECTS;
26 || l_projects(l_index).DESCRIPTION 16

27 || CHR(13) 17 FOR i IN l_projects.FIRST..l_projects.LAST


28 || l_projects(l_index).IS_FFG_PROJECT 18 LOOP
29 ); 19 DBMS_OUTPUT.PUT_LINE(
30 20 l_projects(i).PROJECT_ID
31 l_index := l_index + 1; 21 );
32 END LOOP; 22 END LOOP;
33 END; 23 END;

q q

107
Informationssysteme

12.4. Fehlerbehandlung  12.4.2 Fehlerbehandlung Grundlagen

Eine Fehlerbehandlung muß immer dann durchge-


führt werden, wenn sich die Daten bzw. der Zustand ei-
L Fehlerbehandlung 
ner Anwendung in keinem konsistenten Zustand mehr
Die Fehlerbehandlung bezeichnet das Verhal- befinden.
ten eines Programms, Informationen über Feh-
lerzustände an andere Programmebenen wei- Ein Fehlerbehandlungsprozess umfasst 3 Schritte.
terzureichen.
 Auflistung: Fehlerbehandlungsprozess 
‚ Fehlerdeklaration: Deklaration einer Fehlerklasse.
12.4.1 Fallbeispiel: Fehlerfall ‚ Fehler: Tritt ein Fehlerfall auf wird durch das Da-
Bei der Ausführung des folgenden Programms kommt tenbanksystem ein entsprechendes Fehlerobjekt ge-
es für bestimmte Parameterwerte zu Fehlern. worfen.

‚ Fehlerbehandlung: Im Exceptionteil eines Blocks


 Codebeispiel: Fehlerbehandlung  kann eine Fehlerbehandlung durchgeführt werden.
1 -- ----------------------------------------
2 -- Beispiel: Fehlerbehandlung  Erklärung: Fehlerbehandlung in PL/SQL 
3 -- ----------------------------------------
4 DECLARE
‚ Wird in einem Plsql Block eine Exception ausge-
löst verzweigt die Programmkontrolle zum Fehler-
5 l_amount PLS_INTEGER;
behandlungsteil des Blocks.
6 l_relative PLS_INTEGER;
7 l_result PLS_INTEGER; ‚ Im Fehlerbehandlungsteil wird der Exception
8 BEGIN Handler aufgerufen, der der geworfenen Exception
9 LOOP Kategorie zugeordnet ist.
10 l_amount := 300;
11 l_relative := 0;
‚ Kann eine Exception nicht behandelt werden, weil
z.B.: kein Fehlerbehandlungsteil oder Exception
12 l_result := l_amount/l_relative;
Handler definiert worden ist, wird der Fehler an den
13 END LOOP;
übergeordneten Block weitergegeben.
14 END;
15 ‚ Der Fehler wird solange an übergeordnete Umge-
16 -- ---------------------------------------- bung weitergegeben bis entweder ein entsprechender
17 -- Beispiel: Fehlerbehandlung Exception Handler gefunden ist, bzw. das Programm
18 -- ---------------------------------------- mit einer Fehlermeldung beendet wird.
19 DECLARE
20 l_amount PLS_INTEGER; q
21 l_relative PLS_INTEGER;
22 l_result PLS_INTEGER;
12.4.3 Fehlerbehandlungsobjekt
23 BEGIN
24 LOOP Fehlerbehandlungsobjekte werden durch 4 Attribute
25 l_amount := 300; beschrieben.
26 l_relative := 0;
 Auflistung: Attribte des Fehlerobjekts 
27 l_result := l_amount/l_relative;
28 END LOOP; ‚ name: Eine kurze Beschreibung des Fehlerfalls.
29
‚ type: Definiert welcher Kategorie der Fehlerfall zu-
30 EXCEPTION zuordnen ist.
31 WHEN ZERO_DIVIDE THEN
32 INSERT INTO t_logError(error_t) ‚ exception code: Jedes Fehlerobjekt wird durch eine
33 VALUES (’DIVIDE BY ZERO’); eine eindeutige ID beschrieben.
34 END; ‚ error message: Eine textuelle Beschreibung des Feh-
lerobjekts.
q

108
© Dipl.Ing.-Paul Panhofer Bsc.

Typ Prefix Fehlerobjektkategorie

ORA Datenbankserver Fehler


PLS PL/SQL Fehler
FRM Oracle Form Fehler
REP Oracle Report Fehler

Abbildung 34. Typen von Fehlerobjekten

12.4.4 Klassen von Exceptions 12.4.5 Benutzerdefinierte Fehlerobjekte

Die PL/SQL Spezifikation unterscheidet 2 Typen von


Exceptions: L Anwendungsfehler 
 Standardexception Anwendungsfehler sind durch die Geschäfts-
logik der Anwendung vorgegebene benuter-
 Anwendungsfehler
definierte Fehlerobjkete.

 Erklärung: Klassen von Exceptions 


 Erklärung: Applicationexception 
‚ Standardexceptions: Standardexceptions sind
durch die Plsql Spezifikation definierte Exceptions. ‚ Bevor ein benutzerdefiniertes Fehlerobjekt verwen-
Eine Standardexception besitzt eine Beschreibung det werden kann muß es deklariert werden.
und einen SQL Code. ‚ Optional kann dem Fehlerobjekt ein Exception Co-
‚ Anwendungsfehler: Anwendungsfehler sind spezi- de und eine error message zugeordnet werden.
fisch für bestimmte Anwendungen. Anwendungsfeh- ‚ Das Fehlerobjekt kann nun mit dem raise Schlüs-
ler werden durch die Geschäftslogik der Anwendung selwort ausgelöst werden.
vorgegeben.
 Codebeispiel: Applikationsexceptions 
 Codebeispiel: Applikationsexceptions 
1 -- ----------------------------------------
1 PROCEDURE application_exception 2 -- Beispiel: Applicationexception
2 IS 3 -- ----------------------------------------
3 -- Anlegen einer Exception Variable 4 DECLARE
4 invalid_project_type EXCEPTION; 5 -- Deklaration eines Fehlerobjekts
5 -- Registrieren der Exception im System 6 -- obligatorisch
6 pragma 7 INCREASE_AMOUNT EXCEPTION;
exception_init(invalid_project_type, 8
-20010); 9 -- Exception Code zuordnen
7 BEGIN 10 -- optional
8 BEGIN 11 pragma exception_init(INCREASE_AMOUNT,
9 -- werfen der exception -20999);
10 raise invalid_project_type; 12 BEGIN
11 EXCEPTION 13 RAISE INCREASE_AMOUNT;
12 -- exception handler 14 ...
13 WHEN invalid_project_type THEN... 15 RAISE_APPLICATION_ERROR( -20999, ’...’);
14 END; 16 EXCEPTION
15 END appliaction_exception. 17 -- exception handler
18 END
q
q

109
Informationssysteme

Exceptionname Beschreibung SQL Code

ACCESS_INTO_NULL Program attempted to assign values to the attributes of an uninitialized -6530


object.

CASE_NOT_FOUND None of the choices in the WHEN clauses of a case statement were selected -6592
and there is no ELSE clause.

COLLECTION_IS_NULL Program attempted to apply collection methods other than EXISTS to an -6531
uninitialized nested table or varray, or program attempted to assign values
to the elements of an uninitialized nested table or varray.

CURSOR_ALREADY_OPENED Program attempted to open an already opened cursor. -6511

DUP_VAL_ON_INDEX Program attempted to insert duplicate values in a column that is constrai- -1


ned by a unique index.

INVALID_CURSOR There is an illegal cursor operation. -1001

INVALID_NUMBER Conversion of character string to number failed. -1722

NO_DATA_FOUND Single row SELECT returned no rows or your program referenced a deleted 100
element in a nested table or an uninitialized element in an associative
array (index-by table).

PROGRAM_ERROR Plsql has an internal problem. -6501

ROWTYPE_MISMATCH The host cursor variable and Plsql cursor variable involved in an assignment 9843
have incompatible return types.

SELF_IS_NULL A program attempts to call a member method, but the instance of the 5432
object type has not been initialized.

STORAGE_ERROR Plsql ran out of memory or memory was corrupted. -6500

SUBSCRIPT_BEYOND_COUNT A program referenced a nested table or varray using an index number -6533
larger than the number of elements in the collection.

SUBSCRIPT_OUTSIDE_LIMIT A program referenced a nested table or varray element using an index -6532
number that is outside the legal range (for example, -1).

SYS_INVALID_ROWID The conversion of a character string into a universal rowid failed because -1410
the character string does not represent a ROWID value.

TOO_MANY_ROWS Single row SELECT returned multiple rows. -1422

TRANSACTION_BACKED_OUT The remote portion of a transaction has rolled back. ORA-00061

VALUE_ERROR An arithmetic, conversion, truncation, or size constraint error occurred. -6502

ZERO_DIVIDE A program attempted to divide a number by zero. -1476

Abbildung 35. Standardexceptions

. .

110
© Dipl.Ing.-Paul Panhofer Bsc.

12.4.6 Exception Handler 12.4.7 Fehlerbehandlung für forall

Fehlerbehandlungen in Plsql Programmen erfolgen im Die forall Anweisung erlaubt es mehrere DML Anwei-
Exception Teil von plsql Blöcken. sungen gekapselt auszuführen.

Für jedes Fehlerobjekt das vom System behandelt  Erklärung: Fehlerbehandlung für forall 
werden soll muß ein eigener Exception Handler de- ‚ Tritt ein Fehler bei der Ausführung bei einer der
finiert werden. DML Anweisungen auf, werden die restlichen An-
weisungen trotzdem ausgeführt.
 Erklärung: Exception Handler 
‚ Ein Exception Handler ist für eine einzelne Klasse ‚ Die save exceptions Klausel aggregiert Fehler-
von Fehlerobjekten verantwortlich. nachrichten die bei der Ausführung des forall Befehls
auftreten.
‚ Die Plsql Spezifikation definiert gleichzeitig einen
allgemeinen Exception Handler der für die Verar-  Codebeispiel: Fehlerbehandlung für forall 
beitung beliebiger Fehlerobjekt verwendet werden 1 -- ----------------------------------------
kann. 2 -- Beispiel: Fehlerbehandlung fr forall
3 -- ----------------------------------------
 Codebeispiel: Exception Handler 
4 DECLARE
1 -- ---------------------------------------- 5 TYPE PR_TABLE_TYPE IS TABLE OF
2 -- Beispiel: Applicationexception HR.PROJECT_REPORT%ROWTYPE;
3 -- ---------------------------------------- 6
4 DECLARE 7 l_reports PR_TABLE_TYPE := PR_TABLE_TYPE();
5 -- application exception 8 BEGIN
6 INVALID_COMPANY_ID EXCEPTION; 9 SELECT l.PROJECT_ID, l.TITLE, 201
7 NEGATIVE_BALANCE EXCEPTION; 10 BULK COLLECT INTO l_reports
8 ... 11 FROM HR.L_PROJECTS l;
9 BEGIN 12
10 ... 13 FORALL i IN l_reports.START..l_reports.LAST
11 -- raise application exception 14 SAVE EXCEPTIONS
12 RAISE INVALID_COMPANY_ID; 15 INSERT INTO HR.PROJECT_REPORT VALUES
13 ... l_reports(i);
14 -- raise application exception 16 EXCEPTION
15 RAISE NEGATIVE_BALANCE; 17 WHEN BULK_ERRORS
16
18 THEN
17 EXCEPTION 19 DBMS_OUTPUT.PUT_LINE(
18 -- exception handler NO_DATA_FOUND 20 ’UPDATED ’ || SQL%ROWCOUNT || ’ rows.’
19 WHEN NO_DATA_FOUND 21 );
20 THEN 22
21 ... 23 FOR i IN 1..SQL%BULK_EXCEPTINS.COUNT
22
24 LOOP
23 -- exceptin handler NEGATIVE_BALANCE 25 DBMS_OUTPUT.PUT_LINE(
24 WHEN NEGATIVE_BALANCE 26 ’error ’ || i || ’ occurred ’
25 THEN 27 SQL%BUKL_EXCEPTIONS(i).ERROR_INDEX
26 ... 28 );
27
29
28 -- exception handler 30 DBMS_OUTPUT.PUT_LINE(
29 -- DEFAULT 31 SQLERRM(-1*
30 WHEN OTHERS SQL%BULK_EXCEPTIONS(i).ERROR_CODE)
31 THEN 32 );
32 ... 33 END LOOP;
33 END 34 END

q q

111
Informationssysteme

12.5. Kursor  12.5.2 Verwaltung der Context Area

Der explizite und implizite Zugriff auf die Daten der


L Cursor Definition  Context Area erfolgt über Kursor.

Kursor erlauben den zeilenweisen Zugriff auf  Erklärung: Kursor verwenden 


die Daten einer Tabelle.
‚ Beim Einsatz der for Schleife haben wir bereits
einen impliziten Kursor verwendet. Im Gegensatz
zum impliziten Kursorn der for Schleife ist der Pro-
12.5.1 Kursor Grundlagen
grammierer beim Einsatz eines expliziten Kursors
Mit einem Kursors können die Daten einer Datenbank- selbst für das Management des Kursors verantwort-
tabelle zeilenweise ausgelesen und verarbeitet werden. lich.

 Erklärung: Context Area und Kursor 


‚ Ein Kursor unterscheidet 4 interne Zustände. Je
nach Zustand stellt der Kursor unterschiedliche
‚ Ein Kursor ist eine Referenz auf einen Bereich im Funktionalität zur Verfügung.
Speicher der als Context Area bezeichnet wird.
q
‚ Die Context Area verwaltet die durch DML und
DQL Anweisungen verarbeiteten Daten.
12.5.3 Verwendung von Kursorn
 Codebeispiel: Kursorverarbeitung 
1 -- ----------------------------------------  Programmschritte: Explizite Cursor 
2 -- Codebeispiel: Cursorverarbeitung
3 -- ----------------------------------------
n Declare Cursor 
4 DECLARE
5 -- declaration of a cursor Bei der Deklaration des Kursors wird dem Kur-
6 CURSOR l_employees_cur IS sor ein Bereich der Context Area zugeordnet.
7 SELECT e.* FROM employees e;
8

9 l_employee_rec l_employees_cur%ROWTYPE; ü Open Cursor 


10 BEGIN Beim Öffnen des Cursor führt die Plsql Engine,
11 -- open cursor die mit dem Cursor assozierte select Anwei-
12 OPEN l_employees_cur; sung aus.
13

14 LOOP
15 -- Fetch data from cursor 3 Fetch Data 
16 FETCH l_employee_cur INTO
Die Fetch Answeisung erlaubt den zeilenwei-
l_employee_rec;
sen Zugriff auf die Daten der mit dem Cursor
17 EXIT WHEN l_employee_cur%NOTFOUND;
assozierten select Anweisung.
18

19 DBMS_OUTPUT.PUT_LINE(
20 l_employee_rec.EMPLOYEE_ID ¤ Close Cursor 
21 || l_employee_rec.FIRST_NAME
22 || l_employee_rec.LAST_NAME Wurden alle mit dem Cursor assozierten Da-
23 || l_employee_rec.JOB_ID ten ausgelesen kann der Cursor geschlossen
24 ); werden. Mit dem Schließen des Cursors wer-
25 END LOOP; den die mit dem Cursor assozierten Ressour-
26
cen freigegeben.
27 -- close cursor
28 CLOSE cursor_name; q
29 END;

112
© Dipl.Ing.-Paul Panhofer Bsc.

Cursorattribut Beschreibung Rückgabewert

FOUND Das Attribut speichert den Wert true wenn der vorhergehende fetch Be- Boolean
fehl ein Ergebnis zurückgeliefert hat. Anderfalls wird false gespeichert

NOTFOUND Das Gegenteil von found Boolean

ISOPEN Mit dem Attribut wird geprüft ob der Cursor offen ist. Boolean

ROWCOUNT Gibt die Zahl der Zeilen an die durch die Datenbankoperation bearbeitet Number
worden sind.

BULK_ROWCOUNT Gibt die Zahl der Zeilen an die durch die Datenbankoperation bearbeitet Number
worden sind.

BULK_EXCEPTION Gibt an ob bei der Massendatenverarbeitung Fehler aufgetreten sind. Boolean

Abbildung 36. Cursorattribute

12.5.4 Cursorattribute 12.5.5 Bulk Fetch

Cursor werden zur zeilenweise Verarbeitung von Da-


L Cursorattribute  ten verwendet.
Cursorattribute erlauben den Zugriff auf Infor-  Erklärung: bulk collect Klausel 
mationen der Context Area eines Cursors. ‚ Wird in der fetch Anweisung die bulk collect
Klausel verwendet, ist es möglich Cursor Daten im
Bulk auszulesen.
 Erklärung: Cursorattribute 
‚ Cursorattribute erlauben Zugriff auf die dem Cur-
‚ Das Ergebnis der fetch Operation wird dazu in einer
Collections gespeichert.
sor zugeordnete Kontextinformation.
1 DECLARE  Codebeispiel: bulk collect 
2 CURSOR l_employees_cur IS
1 -- ----------------------------------------
3 SELECT e.* FROM employees e;
2 -- Codebeispiel: Bulk Collect
4
3 -- ----------------------------------------
5 l_employee l_employees_cur%ROWTYPE;
4 PROCEDURE GET_EMPLOYEES AS
6 BEGIN
5 CURSOR l_employees_cur IS
7 OPEN l_employee_cur;
6 SELECT * FROM EMPLOYEES;
8
7
9 LOOP
8 l_employees EMPLOYEE_TABLE_TYPE :=
10 FETCH l_employee_cur INTO l_employee;
EMPLOYEE_TABLE_TYPE();
11 EXIT WHEN l_employee_cur%NOTFOUND;
9 BEGIN
12
10 DBMS_OUTPUT.PUT_LINE(’Cursor - Bulk
13 DBMS_OUTPUT.PUT_LINE(
Collect’);
14 l_employee.EMPLOYEE_ID
11 OPEN l_employees_cur;
15 );
12
16 END LOOP;
13 LOOP
17
14 FETCH l_employees_cur BULK COLLECT INTO
18 CLOSE cursor_name;
l_employees LIMIT 100;
19 END;
15 END;

q q

113
Informationssysteme

12.6. Transaktionen  12.6.2 Anweisung vs. Transaktionen

Vergengenwärtigen wir uns den Unterschied zwischen


L Transaktion  einer erflogreich ausgeführten Anweisung und einer er-
folgreich durchgeführten Transaktion.
Eine Transaktion bezeichnet eine Folge von
Programmschritten die als einzelner Arbeits-
schritt ausgeführt werden. 2 Anweisung ausführen 
Eine SQL Anweisung erfolgreich auszuführen
bedeutet:
12.6.1 Fallbeispiel: Geldüberweisung
‚ Der Befehl konnte erfolgreich von der PlSql
 Codebeispiel: Geldüberweisung  Engine geparst werden.
1 -- ----------------------------------------
2 -- Codebeispiel: Gelduerberweisung ‚ Die PlSql Engine konnte die Richtigkeit der
3 -- ---------------------------------------- Syntax des Befehls bestätigen.
4 DECLARE ‚ Der Befehl konnte als atomare Einheit aus-
5 ... geführt werden.
6

7 BEGIN
8 UPDATE account 3 Transaktion durchführen 
9 SET BALANCE = BALANCE - 100
Durch das Ausführen eines SQL Befehls wer-
10 WHERE ACCOUNT_NR = 7902;
den noch keine Änderungen der Daten in der
11
Datenbank durchgeführt. Erst durch die Aus-
12 UPDATE account
führung der Transaktion werden die Änderun-
13 SET BALANCE = BALANCE + 100
gen an den Daten permanent.
14 WHERE ACCOUNT_NR = 7499;
15
q
16 INSERT INTO account_log
17 VALUES (7902,’DEBIT’, 100);
18

19 ...
20 END;
12.6.3 Implizite Transaktionen
 Analyse: Geldüberweisung  Implizite Transaktionen sind Transaktionen die im-
‚ Wird Geld von einem Konto auf ein anderes Konto plizit von der PL/SQL Engine durchgeführt werden.
überwiesen, muß technisch sichergestellt sein, dass
nur dann eine Abbuchung erfolgt, wenn gleichzeitig  Erklärung: Transaktionen beginnen 
eine Gutschrift auf das andere Konto erfolgt ist. ‚ Für jeden ausführbaren SQl Befehl wird eine neue
‚ Jeder der 3 gegebenen Schritte darf nur dann durch- Transaktion begonnen, falls der Befehl noch keiner
geführt werden, wenn alle 3 Befehle ohne Fehler aus- Transaktion zugeordnet ist.
geführt werden konnten. ‚ Wird eine Transaktion angelegt wird ihr ein Bereich
‚ Schlägt die Ausführung eines der 3 Befehle fehl, darf des Tablespace der Datenbank zugeordnet, um die
keiner der Befehle ausgeführt werden. Änderungen der Transaktion im Fehlerfall wieder
rückgängig machen zu können.
‚ Mit der Hilfe einer Transaktion kann das gewünsch-
te Verhalten erreicht werden. ‚ Bevor ein DDL bzw. DML Befehl ausgeführt wird
werden die existierenden, impliziten Transaktionen
‚ Werden mehrere Befehle einer Transaktion zuge-
durchgeführt. Die auftretenden DDL bzw. DML Be-
ordnet, können die Befehle nur dann ausgefürt wer-
fehle werden einer neuen Transaktion zugeordnet.
den, wenn keiner der Befehle einen Fehler auslöst.
q
q

114
© Dipl.Ing.-Paul Panhofer Bsc.

 Codebeispiel: Implizite Transaktionen  12.6.5 DCL: commit und rollback


1 -- ----------------------------------------
2 -- Codebeispiel: Implizite Transaktionen L DCL 
3 -- ----------------------------------------
4 DECLARE Die Data Control Language ist ein Teil der SQL
5 ... Spezifikation. Der Standard enthält Befehle für
6 l_is_table_present PLS_INTEGER DEFAULT 0; die Rechtevergabe und das Transaktionsma-
7 BEGIN nagement in Datenbank.
8 -- transaction work1 begin
9 DBMS_OUTPUT.PUT_LINE(’Implizite
 Erklärung: DCL Befehle 
Transaktionen’);
10
‚ commit: Wird der commit Befehl ausgeführt, werden
11 SELECT count(u.TABLE_NAME) alle mit der gegenwärtigen Transaktion assozierten
12 INTO l_is_table_present Änderungen permanent in der Datendbank durch-
13 FROM USER_TABLES u geführt.
14 WHERE u.TABLE_NAME = ’ACCOUNT’; ‚ rollbalck: Alle Änderungen, die mit den mit der
15 Transaktion assozierten Befehlen durchgeführt wur-
16 -- transaction work1 commit den, werden durch den rollback Befehl rückgängig
17 -- transaction work2 begin gemacht.
18 UPDATE account
19 SET BALANCE = BALANCE - 100  Codebeispiel: Autonome Transaktionen 
20 WHERE ACCOUNT_NR = 7902;
1 -- ----------------------------------------
21 -- transcation work2 commit
2 -- Codebeispiel: Autonome Transaktionen
22
3 -- ----------------------------------------
23 -- transaction work3 begin
4 DECLARE
24 UPDATE account
5 l_is_table_present PLS_INTEGER DEFAULT 0;
25 SET BALANCE = BALANCE + 100
6
26 WHERE ACCOUNT_NR = 7499;
7 pragma autonomous_transaction;
27 -- transaction work3 commit
8 BEGIN
28 END;
9 -- begin transaction work1
10 SELECT count(u.TABLE_NAME)
q 11 INTO l_is_table_present
12 FROM USER_TABLES u
12.6.4 Autonome Transaktionen 13 WHERE u.TABLE_NAME = ’ACCOUNT’;
14

Im Gegensatz zu impliziten Transaktionen kann der 15 COMMIT;


Programmierer mit autonomen Transaktionen steu- 16 -- end transaction work1
ern welche Befehle einer Transaktion zugeordnet wer- 17

den sollen. 18 -- begin transaction work2


19 UPDATE account
 Erklärung: Autonome Transaktionen 
20 SET BALANCE = BALANCE - 100
‚ Mit autonomen Transaktionen übernimmt der Pro- 21 WHERE ACCOUNT_NR = 7902;
grammierer die Verantwortung für das Transaktion- 22
management für das Programm.
23 UPDATE account
‚ Wird ein Block als autonom definiert werden kei- 24 SET BALANCE = BALANCE + 100
ne impliziten Transaktionen im Ausführungsteil des 25 WHERE ACCOUNT_NR = 7499;
Blocks mehr initiert. 26

27 COMMIT;
‚ Mit dem commit bzw. rollback Befehl kann der
28 -- end transaction work2
Prgrammierer nun das Transaktionamanagement
29 END;
steuern.

q q

115
Informationssysteme

12.6.6 Änderungen zurücknehmen .

Der rollback Befehl wird verwendet um die mit ei-


ner Transaktion assozierten Änderungen zurück zu-
nehmen.

 Codebeispiel: Änderungen zurücknehmen 


1 -- ----------------------------------------
2 -- Codebeispiel: Aenderungen zuruecknehmen
3 -- ----------------------------------------
4 DECLARE
5 pragma autonomous_transaction;
6 BEGIN
7 UPDATE account
8 SET BALANCE = BALANCE - 100
9 WHERE ACCOUNT_NR = 7902;
10

11 UPDATE account
12 SET BALANCE = BALANCE + 100
13 WHERE ACCOUNT_NR = 7499;
14

15 COMMIT;
16 EXCEPTION
17 WHEN OTHERS THEN ROLLBACK; RAISE;
18 END;

12.6.7 DCL: Savepoints definieren

savepoint ist ein DCL Befehl ist ein Befehl der an-
gibt bis zu welchem Befehl das Rollback rückgängig
gemacht werden soll.

 Codebeispiel: Savepoints definieren 


1 -- ----------------------------------------
2 -- Codebeispiel: Savepoints definieren
3 -- ----------------------------------------
4 BEGIN
5 UPDATE ...;
6 SAVEPOINT A;
7

8 UPDATE ...;
9 SAVEPOINT B;
10

11 IF conditions THEN
12 ROLLBACK TO SAVEPOINT A;
13 END IF;
14

15 ROLLBACK TO SAVEPOINT B;
16 END;

116
© Dipl.Ing.-Paul Panhofer Bsc.

. .

117
Informationssysteme

13. PL/SQL - Blöcke 13.1. Blocktyp - Stored Prozedur 

Mit Prozeduren wird PlSQL Code in Unterpro-


gramme strukturiert.

13.1.1 Grundlagen - Stored Prozedures

L Prozedur 
Eine Prozdur ist ein PlSql Unterprogramm.

 Syntax: Plsql Prozedur 


1 -- ----------------------------------------
2 -- Syntax: Plsql Prozedur
3 -- ----------------------------------------
4 CREATE [OR REPLACE] PROCEDURE procedure_name
5 [(Parameter1, [Parameter2, ... ])]
6 IS [AUTHID DEFINER | CURRENT_USER]
7 declare variable, constant, etc. here
8 BEGIN
01. Blocktyp: Stored Prozedure 118 9 Eexucutable statements;
10 END [procedure_name];
02. Blocktyp: Package 121
 Codebeispiel: Prozedur 
03. Blocktyp: Trigger 123
1 -- ----------------------------------------
2 -- Codebeispiel: Plsql Prozedur
3 -- ----------------------------------------
4 CREATE OR REPLACE PROCEDURE
5 update_project (
6 p_project_id IN OUT PLS_INTEGER,
7 p_project_title IN OUT VARCHAR2,
8 p_project_type IN OUT VARCHAR2,
9 p_description IN OUT VARCAHR2
10 )
11 AS
12 l_project_desc VARCHAR2(4000);
13 BEGIN
14 SELECT description
15 INTO l_project_desc
16 FROM projects
17 WHERE project_id = p_project_id;
18

19 UPDATE projects
20 SET project_title = p_project_title,
21 project_type = p_project_type
22 WHERE project_id = p_project_id;
23

24 END update_project;

118
© Dipl.Ing.-Paul Panhofer Bsc.

 Codebeispiel: Prozedur ohne Parameter  13.1.3 Formen der Paramaterübergabe


1 -- ----------------------------------------
2 -- Codebeispiel: Prozedur
 positionelle Parameterübergabe 
3 -- ----------------------------------------
4 CREATE OR REPLACE PROCEDURE log_project AS Bei einer positionellen Parameterübergabe
5 BEGIN werden Werte den Parametern in derselben
6 DBMS_OUTPUT.PUT_LINE(’updated project:’); Reihenfolge zugeordnet, in der sie in der Pro-
7 END; zedur definiert worden sind.

q £ nominelle Parameterübergabe 
Bei einer nominellen Parameterübergabe wer-
13.1.2 Prozedur mit Parametern den die gewünschten Werte explizit dem Na-
men eines Parameters zugeordnet.
 Erklärung: Prozeduren mit Parametern 
‚ Parameter werden nach dem Namen der Prozedur  Erklärung: nominelle Parameterübergabe 
als kommaseparate Liste angegeben.
‚ Werden die Parameter einer Prozedur nominell
‚ Analog zur Deklartion von Variablen wird zuerst der übergeben, muß beim Aufruf der Prozedur keine
Name des Parameters gefolgt vom Typ des Parame- Rücksicht auf die Reihenfolge der Parameter mehr
ters definiert. genommen werden.

‚ Plsql unterscheidet 3 Typen von Parametern. ‚ Beim Aufruf der Prozedur muß die Reihenfolge der
Parameter nicht mehr bekannt sein.
 Auflistung: Typen von Parameter  ‚ Bei einer nominellen Parameterübergabe muß je-
doch der Name des Parameters bekannt sein.
 in - Parameter 
 Codebeispiel: Parameterübergabe 
In Parameter verhalten sich innerhalb von Pro-
1 -- ----------------------------------------
zeduren wie initialisierte Konstanten. Den Pa-
2 -- Codebeispiel: Parameteruebergabe
rameteren kann in der Prozedur kein neuer
3 -- ----------------------------------------
Wert zugwiesen werden.
4 CREATE OR REPLACE
Beim Aufruf werden ihnen Werte mittels Kon- 5 PROCEDURE print_return_date (
stanten oder Variablen zugewiesen. 6 p_start_date IN DATE,
7 p_day_amount IN NUMBER
8 )
( in out - Parameter  9 AS
10 l_end_time VARCHAR2(25);
In/Out Parameter verhalten sich innerhalb von
11 BEGIN
Prozeduren wie initilaisierte Variablen. Den
12 l_end_time := to_char(
Parametern kann im Anweisungsteil der Proze-
13 next_day(
dur ein neuer Wert zugewiesen werden.
14 p_start_date + p_day_amount,
Beim Aufruf werden ihnen Werte mittels Varia- 15 ’MON’
blen übergegen. 16 ), ’DD.MM.YYYY’
17 );
18 END print_return_date;
 out - Parameter  19

Ausgabeparameter verhalten sich innerhalb 20 call print_return_date(


von Prozeduren wie nichinitialisierte Varia- 21 p_day_amount => 24,
blen. Ihnen kann im Anweisungsteil der Proze- 22 p_start_date => sysdate
dur ein neuer Wert zugewiesen werden. 23 );

q q

119
Informationssysteme

13.1.4 Optionale Parameterübergabe 13.1.5 Funktionen

Parameter können bei der Definition einer Prozedur


mit einem Vorgabewert belegt werden. L Funktion 
Eine Funktion ist eine Prozedur mit einem Rück-
 Codebeispiel: Parameterübergabe  gabewert.
1 -- ----------------------------------------
2 -- Optionale Parameteruebergabe
3 -- ----------------------------------------  Codebeispiel: Funktionen 
4 CREATE OR REPLACE 1 -- ----------------------------------------
5 PROCEDURE print_return_date ( 2 -- Syntax: Funktion
6 p_start_date IN DATE := sysdate, 3 -- ----------------------------------------
7 p_day_amount IN NUMBER := 24 4 CREATE [OR REPLACE] FUNCTION function_name
8 ) 5 (Parameter1, Parameter2, ...)
9 AS 6 RETURN datatype IS
10 l_end_time varchar2(25); 7 declare variable, constant, etc. here
11 BEGIN 8 BEGIN
12 ... 9 exucutable statements;
13 10 RETURN (Return Value);
14 END print_return_date; 11 END [function_name];
15 12
16 -- optionale Parameteruerbergabe 13 -- Codebeispiel: Funktion
17 call print_return_date( 14 CREATE OR REPLACE FUNCTION circle_area (
18 p_start_date => to_date( 15 p_radius NUMBER
19 ’24.01.2013’, 16 )
20 ’DD.MM.YYYY’ 17 RETURN NUMBER IS
21 ) 18 c_pi CONSTANT NUMBER(7,2) DEFAULT 3.1415;
22 ); 19 l_area NUMBER(7,2);
23 20 BEGIN
24 -- Parameteruebergabe 21 l_area := c_pi * (p_radius * p_radius);
25 call print_return_date( 22 RETURN l_area;
26 to_date(’24.01.2013’, ’DD.MM.YYYY’), 30 23 END circle_area;
27 );

q
q

120
© Dipl.Ing.-Paul Panhofer Bsc.

13.2. Blocktyp - Package  13.2.2 Package Spezifikation

L Package Spezifikation 
L Package 
Die öffentliche Schnittstelle des Packages wird
Ein Package ist eine PlSql Block zur Kapselung
als Package Spezifikation bezeichnet.
von Prozduren, Funktionen und Variablen.

Ein Package besteht aus der Packagespezifikation


Ein Package ist konzeptionell vergleichbar mit einer
und der Packageimplementierung.
Klasse.

 Erklärung: Package   Erklärung: Package Spezifikation 


‚ Package Spezifikation: Die Package Spezifikation ‚ Die Package Spezifikation abstrahiert die öffentliche
ist die öffentliche Schnittstelle des Packages. Schnittstelle eines Packages.
‚ Package Body: Der Package Body stellt die Imple- ‚ Werden Variablen in einer Package Spezifikation de-
mentierung der Package Spezifikation dar. finiert, werden die Variablen im globalen Kontext
der Datenbank angelegt.

13.2.1 Verwendung von Packages  Syntax: Package Spezifikation 


1 -- ----------------------------------------
 Analyse: Verwenden von Packages  2 -- Syntax: Package Spezifikation
3 -- ----------------------------------------
| Verwaltung von Code  4 CREATE [OR REPLACE] PACKAGE pkg_name
5 AS
Packages sind Container für PlSQL Objekte, 6 Deklaration der Package Elemente
wie Prozeduren und Variablen. 7 END[pkg_name];

In einem Package sollten nur thematisch ver-


wandte Objekte zusammengefasst werden.  Codebeispiel: Package Spezifikation 
Packages werden verwendet um die Kohösi- 1 -- ----------------------------------------
on von Plsql Programmen sicherzustellen. 2 -- Codebeispiel: Package Spezifikation
3 -- ----------------------------------------
4 CREATE OR REPLACE PACKAGE tools
3 Anwendungsdesign  5 AS
6 -- globale Konstanten und Variablen
Mit der Trennung der öffentlichen Schnittstelle
7 gc_math_pi CONSTANT NUMBER := 3.1456;
von der Implementierung des Packages, wird
8 g_std_day_amount NUMBER DEFAULT 0;
eine Entkoppelung der Anwendungslogik er-
9
reicht.
10 -- globale Prozeduren und Funktionen
11 FUNCTION get_xml_date_string (
L Information Hiding  12 p_date IN date ,
13 p_with_time IN char DEFAULT ’Y’
Objekte die im Package Header definiert wer-
14 ) return VARCHAR2;
den, liegen im globalen Kontext der Daten-
15
bank.
16 -- globale Funktionen
17 FUNCTION get_return_date (
( Performance  18 p_start_date IN date DEFAULT sysdate,
19 p_day_amount IN number
Wird ein Unterprogramm des Packages zum
20 ) return date;
ersten Mal aufgerufen wird, wird das Packa-
21
ge im Ganzen in den Speicher geladen.
22 END tools;

q
q

121
Informationssysteme

13.2.3 Package Körper 14 p_with_time IN char DEFAULT ’Y’


15 ) return VARCHAR2
16 AS
L Package Körper 
17 l_format_mask varchar2(30) :=
Der Package Körper stellt die Implementie- ’YYYY-MM-DD’;
rung der Packagespezifikation dar. 18 BEGIN
19 IF lower(p_with_time) IN (’y’,’j’,’1’)
THEN
 Erklärung: Package Körper 
20 l_format_mask := l_format_mask ||
‚ Implementierung: Im Package Körper erfolgt die ’"T"HH24:MI:SS’;
Implementierung aller in der Package Spezifikation 21 END IF;
definierten Unterprogramme. 22

23 RETURN to_char(p_date_in,
‚ private Prozeduren und Funktionen: Im Packa-
l_format_mask);
ge Körper können auch Unterprogramme implemen-
24 END get_xml_date_string;
tiert werden die nicht Teil der Package Spezifikation
25
sind. Diese Unterprogramme können jedoch nur in-
26
nerhalb des Package Körpers selbst aufgerufen wer-
27 -- ----------------------------------------
den.
28 -- Prozedur: print_return_date
‚ Package Initialisierung: Im Package Körper steht
29 -- ----------------------------------------
die Möglichkeit zur Verfügung eine Initialisierung 30 PROZEDURE print_return_date(
des Packages durchzuführen. Diese Code wird nur 31 p_start_date IN date DEFAULT sysdate,
beim Lades des Packages in den Hauptspeicher aus- 32 p_day_amount IN number
geführt. 33 )
34 AS
 Syntax: Package Körper  35 BEGIN
1 -- ---------------------------------------- 36 dbms_output.put_line(
2 -- Syntax: Package Koerper 37 ’Rueckgabewert ist: ’ ||
3 -- ---------------------------------------- 38 get_return_date(p_start_date,
4 CREATE OR REPLACE PACKAGE BODY pkg_name 39 p_day_amount)
5 AS 40 );
6 -- Variablen Deklarationen; 41 END print_return_date;
42
7 -- Type Deklarationen;
8 -- Implementierung der Package Elemente 43 -- ----------------------------------------
9 BEGIN 44 -- Prozedur: get_return_date
10 -- Initialisierungsteil 45 -- ----------------------------------------
11 END[pkg_name]; 46 FUNCTION get_return_date (
47 p_start_date IN date DEFAULT sysdate,
48 p_day_amount IN number
 Codebeispiel: Package Körper  49 ) return date
1 -- ---------------------------------------- 50 AS
2 -- Codebeispiel: Packagekoerper 51 BEGIN
3 -- ---------------------------------------- 52 return next_day(
4 CREATE OR REPLACE PACKAGE BODY tools 53 p_start_date + p_day_amount, ’MON’
5 AS 54 );
6 PROCEDURE initialize 55 END get_return_date;
7 AS 56

8 BEGIN 57 BEGIN
9 g_std_day_amount := 24; 58 initialize();
10 END; 59 END tools;
11

12 FUNCTION get_xml_date_string (
q
13 p_date_in IN date ,

122
© Dipl.Ing.-Paul Panhofer Bsc.

13.3. Trigger  13.3.2 Anlegen von Triggern

 Syntax: Anlegen von Triggern 


L Trigger  1 -- ----------------------------------------
Ein Datenbanktrigger ist eine in der Da- 2 -- Codebeispiel: Anlegen von Triggern
tenbank gespeicherte Prozedur, deren Auf- 3 -- ----------------------------------------
ruf durch ein vordefiniertes Ereignis ausgelöst 4 CREATE [OR REPLACE] TRIGGER trigger_name
wird. 5 [BEFORE|AFTER] trigger_event ON table_name
6 [FOR EACH ROW]
7 [FOLLOWS another_trigger_name]
8 [ENABLE/DISABLE] [WHEN condition]
13.3.1 Auslösen von Triggern 9 DECLARE
10 ...
Trigger sind anonyme Blöcke. Genauer gesagt handelt 11 BEGIN
es sich bei Triggern um den ereignisgesteuerten Aufruf 12 ...
eines Blocks. 13 END;
14

Beim Anlegen des Triggers wird definiert welches 15 -- Triggerereignis festlegen


Ereignis den Trigger ausgelösen soll. 16 [BEFORE|AFTER] trigger_event ON table_name
17

18 -- Triggerart definieren
19 [FOR EACH ROW]
20

21 -- Ketten von Triggern definieren


22 [FOLLOWS another_trigger_name]
23

24 -- Trigger verwalten
25 [ENABLE/DISABLE]
26

27 -- Filter
28 [WHEN condition]
29

 Auflistung: Auslösen eines Triggers  30 -- ----------------------------------------


31 -- Codebeispiel: Log Beispiel
‚ DML Ereignisse: DML Trigger sind an DML An- 32 -- ----------------------------------------
weisungen gebunden. Der Trigger wird ausgelöst 33 CREATE OR REPLACE TRIGGER tr_project_log
wenn die entsprechende DML Anweisung ausgeführt 34 AFTER INSERT OR UPDATE OF title ON projects
wird. 35 FOR EACH ROW
36 ENABLE
‚ Datenbankereignisse: Folgende Ereignisse werden 37 DECLARE
in PL/SQL alsDatenbankereignisse kategorisiert: 38 l_name VARCHAR(100);
‚ logon, logoff, db_role_change 39 BEGIN
40 SELECT user INTO l_user FROM DUAL;
‚ alter, drop , create 41

‚ startup, shutdown 42 IF INSERTING THEN


43 DBMS_OUTPUT.PUT_LINE(
‚ serverError 44 ’inserted data by ’ || l_user
45 );
Ein Trigger der von einem Datenbankereigins aus- 46 END IF;
gelöst wird, wird als Datenbanktrigger bezeichnet. 47 END;

q
q

123
Informationssysteme

13.3.3 DML Event definieren  Codebeispiel: Trigger 


1 -- ----------------------------------------
DML Trigger sind an DML Anweisungen wie insert,
2 -- Codebeispiel: Log Beispiel
update bzw. delete gebunden.
3 -- ----------------------------------------
 Erklärung: Ereignisse definieren  4 CREATE OR REPLACE TRIGGER tr_project_log
5 AFTER INSERT OR UPDATE OF title ON projects
‚ Triggerevent: Beim Anlegen eines DML Triggers
6 FOR EACH ROW
wird das Triggerevent definiert, das den Trigger aus-
7 ENABLE
löst.
8 DECLARE
‚ Triggerzeitpunkt: Mit den Schlüsselwörtern before 9 l_name VARCHAR(100);
und after wird bestimmt ob der Trigger nach oder 10 BEGIN
vor dem Ausführen des DML Befehls ausgelöst wird. 11 SELECT user INTO l_user FROM DUAL;
12

13 IF INSERTING THEN
14 DBMS_OUTPUT.PUT_LINE(
15 ’inserted data into projects by ’
16 || l_user
17 );
18 ELSIF UPDATING THEN
19 DBMS_OUTPUT.PUT_LINE(
20 ’updated data into projects by ’
21 || l_user
22 );
 Codebeispiel: Trigger  23 END IF;
24 END;
1 -- ----------------------------------------
2 -- Codebeispiel: Log Beispiel
3 -- ---------------------------------------- q
4 CREATE TABLE project_logs (
5 log_id NUMBER(19,0) not null unique,
13.3.4 Pseudorecords
6 log VARCHAR(100) not null,
7 PRIMARY KEY (log_id)
8 ); L Kontext 
9
Der Kontext ist ein Sessionchache, der durch
10 INSERT INTO projects_log (log) VALUES
die Datenbank für bestimmte Datenbanko-
(’inserted project’);
pertionen verwaltet wird.
11

12 -- ----------------------------------------
13 -- Loggen von Events  Erklärung: Kontext 
14 -- ---------------------------------------- ‚ Der Kontext eines Triggers, kapselt jene Daten die
15 CREATE OR REPLACE TRIGGER tr_project_log durch die DML Anweisung bearbeitet werden, die
16 AFTER INSERT ON projects den Trigger ausgelöst hat.
17 FOR EACH ROW
18 ENABLE ‚ Der Kontext beinhaltet dabei z.b.: für ein update
19 DECLARE die gegenwärtig in der Datenbank gespeicherten Da-
20 l_name VARCHAR(100); ten als auch jene Werte, durch die die gespeicherten
21 BEGIN Werte ersetzt werden sollen.
22 SELECT user INTO l_user FROM DUAL; ‚ Um auf die Werte aus dem Cache zugreifen zu kön-
23 DBMS_OUTPUT.PUT_LINE(l_user || ’entered nen wird der OLD und NEW Pseudorecord zur Verfü-
data’); gung gestellt.
24 END;

124
© Dipl.Ing.-Paul Panhofer Bsc.

 Codebeispiel: Pseudorecords  13.3.5 Arten von Triggern


1 -- ----------------------------------------
Für DML Trigger kann bestimmt werden, ob der Trig-
2 -- Codebeispiel: Log Beispiel
ger nur einmal für die gesamte Anweisung oder für
3 -- ----------------------------------------
jede durch die Anweisung betroffene Zeile einzeln aus-
4
geführt werden soll.
5 CREATE OR REPLACE TRIGGER tr_project_audit
6 AFTER INSERT OR UPDATE OR DELETE ON  Auflistung: Arten von Triggern 
projects
7 FOR EACH ROW 2 Anweisungstrigger 
8 ENABLE
9 DECLARE Der Trigger wird einmal pro DML Anweisung
10 c_insert_operation CONSTANT VARCHAR2(10) ausgelöst.
:= ’INSERT’;
11 c_update_operation CONSTANT VARCHAR2(10)
3 Zeilentrigger 
:= ’UPDATE’;
12 c_delete_operation CONSTANT VARCHAR2(10) Zeilentrigger werden für jeden Datensatz aus-
:= ’DELETE’; gelöst, die durch die DML Anweisung verän-
13 dert wurden.
14 l_name VARCHAR(100);
15 l_date VARCHAR(30); q
16 BEGIN
17 SELECT user, TO_CHAR(sysdate, ’DD/MON/YYYY 13.3.6 Konditionaler Aufruf von Triggern
HH24:MI:SS’)
18 INTO l_user, l_date Es ist möglich die Ausführung eines Trigger in Abhän-
19 FROM DUAL; gigkeit zu setzen von einer Bedingung.
20
 Codebeispiel: Trigger 
21 IF INSERTING THEN
1 -- ----------------------------------------
22 INSERT INTO projects_audit VALUES (
2 -- Bedingtes Ausloesen von Triggern
23 :NEW.title, null,
3 -- ----------------------------------------
24 l_user,
4 CREATE OR REPLACE TRIGGER tr_project_log
25 l_date,
5 AFTER UPDATE OF title ON projects
26 c_insert_operation
6 FOR EACH ROW
27 );
7 ENABLE
28 ELSIF UPDATING THEN
8 -- Formulierung einer Bedingung
29 INSERT INTO projects_audit VALUES (
9 WHEN (new.title != old.title)
30 :NEW.title, :OLD.title,
10 DECLARE
31 l_user,
11 l_name VARCHAR(100);
32 l_date,
12 BEGIN
33 c_update_operation
13 SELECT user INTO l_user FROM DUAL;
34 );
14
35 ELSIF DELETING THEN
15 DBMS_OUTPUT.PUT_LINE(
36 INSERT INTO projects_audit VALUES (
16 ’operation: ’
37 NULL,
17 || ’updating ’
38 :OLD.TITLE,
18 || ’projects’
39 l_user,
19 || ’old value: ’
40 l_date,
20 || :old.title
41 c_delete_operation
21 || ’new value: ’
42 );
22 || :new.title
43 END IF;
23 );
44 END;
24 END;

q
q

125
Informationssysteme

14. PL/SQL - SQL Funktionen 14.1. Regeln der Erweiterung 


Einer der wichtigsten Einsatzbereiche von PlSql ist die
Erweiterung des SQL Befehlssatzes um zusätzliche
Funktionen.

14.1.1 Regeln der Erweiterung

Bei der Erweiterung des SQL Befehlssatz um PL/S-


QL Funktionen müssen bestimmte Regeln eingehalten
werden.

 Auflistung: Regeln der Erweiterung 

n Idempotent 

Implementierungen von SQL Funktionen müs-


sen Idempotenz garantieren. Einen SQL Funk-
tion ist idempotent wenn bei ihrer Ausführung
keine Nebeneffekte auftreten.

01. Regeln der Erweiterung 126 3 Optimizer Hints 

Der Optimizer ist ein Preprozessor der die Aus-


führung von SQL Funktionen verbessert.

14.1.2 Funktionen für SQL

Mit PL/SQL Funktionen kann die SQL Spezifikation


um zusätzliche Funktionen erweitert werden.

Bei der Programmierung von SQL Funktionen


müssen bestimmte Regeln eingehalten werden.

 Auflistung: Restriktionen 
‚ Funktionsparameter: Funktionsparameter in SQL
Funktionen dürfen keine out Parameter sein.

‚ SQL Datentypen: Funktionsparameter in SQl


Funktionen müssen SQL kompatible Datentypen
haben.

‚ null Werte: Tritt ein Fehler bei der Ausführung ei-


ner SQL Funktion auf sollte darauf nicht mit dem
Werfen einer Exception reagiert werden. Geben Sie
stattdessen null als Ergebnis zurück.

126
© Dipl.Ing.-Paul Panhofer Bsc.

14.1.3 Idempotent 14.1.5 Fallbeispiel: Berechnung der Fakultät

Bei der Ausführung von SQL Funktionen dürfen keine Der SQL Befehlssatz soll um eine Funktion erweitert
Nebeneffekte auftreten. werden.

 Codebeispiel: Fakultät berechnen 


 Analyse: Vermeiden von Nebeneffekten 
1 -- ----------------------------------------
‚ keine DDL Anweisungen: Verwenden Sie keine
2 -- Fakultaet berechnen
DDL Anweisungen innerhalb von SQL Funktionen.
3 -- ----------------------------------------
‚ keine DCL Anweisungen: Verweiden Sie keine DCL 4 CREATE OR REPLACE FUNCTION factorial(
Anweisungen innerhalb von SQL Funktionen. 5 p_n in NATURAL)
6 RETURN NUMBER DETERMINISTIC PARALLEL_ENABLE
‚ lokaler Kontext: Verändern Sie keine Daten die im
7 IS
globalen Kontext - globale Variablen - liegen.
8 numeric_value_exception exception;
q 9 pragma exception_init(
10 numeric_value_exception, -6502);
11

12 l_n NATURAL RANGE 0 .. 8 := round(p_n);


13 l_result NUMBER := 1;
14 BEGIN
14.1.4 Optimizer Hints 15 IF l_n in (0, 1) THEN l_result := 1;
16 ELSE
Optimizer Hints können helfen die Ausführung von
17 FOR i = 2 .. p_n LOOP
SQL Funktionen zu beschleunigen.
18 l_result := l_result * i;
Der Optimizer muß sich auf die Richtigkeit der An- 19 END LOOP;
gabe des Programmierers verlassen können. 20 END IF;
21

22 RETURN l_result;
 Analyse: Optimizer Hints 
23 EXCEPTION
‚ deterministic: Mit dem deterministic Hint garan-
24 WHEN numeric_value_exception THEN
tiert der Programmierer der SQL Engine, dass bei 25 CASE WHEN p_n < 0 or p_n is null THEN
der Ausführung der Funktion für gleiche Eingabepa- 26 RETURN null;
rameter immer das selbe Ergebnis berechnet wird.
27 END CASE;
‚ parallel_enable: Mit dem Hint teilen Sie der Da- 28 WHEN others THEN
tenbank mit, dass die Ausführung der SQL Funktion 29 raise;
parallelisiert erfolgen kann. 30 END factorial;

q q

127
Informationssysteme

. .

128
Informationssysteme - Theorieskriptum
.

NoSQL - Prinzipien
Version 1.0
Informationssysteme

15. NoSQL - Prinzipien 15.1. Bigdata 

L Big Data 
Der Begriff Big Data beschreibt Datenbestän-
de, die aufgrund ihres Umfangs, ihrer Struktur
bzw. ihrer Schnelllebigkeit nur begrenzt oder
gar nicht mit relationalen Datenbanken verar-
beitet werden können.

L | 
15.1.1 Grundlagen

Das Datenvolumen in Datenverarbeitungssyste-


men7 verdoppelt sich nach aktuellen Berechnungen alle
2 Jahre.

 Erklärung: Bigdata 
01. Bigdata 130 ‚ Der enorme Datenzuwachs in Wirtschaft, For-
schung und privatem Umfeld ergibt sich aus der Di-
gitalisierung von Inhalten in digitalen Verwaltungs-
02. Verteilte Datenbanken 132
, Steuer- und Kommunikationssystemen.
03. NoSQL Datenbanken 133 ‚ In sozialen Netzwerken, der Finanzindustrie
bzw. dem Gesundheitswesen entstehen neue
Anwendungs- und Geschäftsfelder die mit großen
Datenmengen arbeiten müssen.

Bigdata Anwendungsbeispiele sind dort zu finden,


wo große Datenmengen zeitnah oder nach unter-
schiedlichen Kriterien analysiert bzw. verarbeitet
werden müssen.

 Auflistung: Anwendungsbeispiele 
‚ Datenvolumen: Das enorme Datenvolumen das in
sozialen Netzwerken generiert werden muß über-
steigt in der Regel die Möglichkeiten relationaler Da-
tenbanken.

‚ Datenverarbeitung: Die Notwendigkeit von Unter-


nehmen Echtzeitauswertungen von Webstatistiken
in diversen Geschäftsfeldern durchzuführen erfordert
neue Methoden der Datenverarbeitung.

7
Informationssysteme

130
© Dipl.Ing.-Paul Panhofer Bsc.

15.1.2 Herausforderungen im Bigdata 15.1.3 Technologien im Bigdata Umfeld

Die grundlegenden technischen Herausforderungen Der Begriff Bigdata stammt aus dem englischen
im Bigdata Umfeld werden abstrahiert als die soge- Sprachraum. Erst als Phänomen bzw. Hype wahrge-
nannten 3V - Volume, Velocity und Variety. nommen, fassen IT Experten zwischenzeitlich unter
dem Begriff 2 Aspekte zusammen.
 Auflistung: Herausforderungen Big Data 
 Auflistung: Aspekte des Bigdata 
 Volume  ‚ Datenmenge: Der Begriff Bigdata wird verwendet
um große Datenmengen in der IT zu beschreiben.
Mit Volume ist die schiere Menge an Daten ge-
meint, die pro Zeiteinheit verarbeitet werden ‚ Technologie: Bigdata steht gleichzeitig für leis-
muss. tungsstarke IT-Lösungen und Systeme, mit denen
große Datenmengen verarbeitet werden können.
¨ Velocity 
Velocity beschreibt die Geschwindigkeit, mit L NoSQL Systeme 
der Daten verarbeitet werden müssen.
NoSQL Systeme sind Informationssysteme die
entwickelt wurden um den Herausforderun-
 Variety  gen des Bigdata zu begegnen. NoSQL ist ein
Acronym und steht für not only sql.
Variety beschreibt die unterschiedlichen Gra-
de der Strukturierung der Daten.
 Erklärung: NoSql Systeme 
‚ Hinter NoSQL Systemen steht nicht ein einzelnes
Technologiekonzept wie bei relationalen Datenban-
ken. Vielmehr wird mit dem Begriff NoSQL eine
Zu den Herausforderungen von Big Data zählt Vielzahl von unterschiedlichen Technologien asso-
nicht nur die Speicherung von großen Datenmengen ziert.
sondern gleichfalls die Extraktion von Wissen aus ‚ Wichtig ist hierbei, daß diese Technologien mit klas-
Daten. sischen Datenbanken in Einklang gebracht werden
können. Nur so kann die Konsistenz der Daten über
Das Ziel von Datenextraktion ist die effiziente und Systemgrenzen hinweg gewährt werden.
schnelle Analyse von Daten zu verwertbarer Informa-
tion. q

131
Informationssysteme

15.2. Verteilte Datenbanken  banken, die unabhängig voneinander arbeiten, je-


doch nach außen wie ein einziges logisches System
Datenverarbeitungssysteme verwalten in der Regel erscheinen.
ihre Daten in einer einzelnen Datenbank.
 Eigenschaften: Verteilte Datenbanksysteme 

L |  ‚ Availability: Verteilte Datenbanksysteme weisen ei-


ne hohe Verfügbarkeit auf.

15.2.1 Grenzen konventioneller Datenbanken Konventionelle Datenbanken können allzuleicht der


Flaschenhals einer Softwareanwendung werden. In
Datenverarbeitungssysteme sehen sich jedoch im- der Regel genau dann, wenn viele Nutzer zeitgleich
mer öfter damit konfrontiert Datenbestände im Big- darauf zugreifen und sich die Antwortzeiten ver-
data Bereich verarbeiten zu müssen. schlechtern. Verteilte Datenbanksysteme kennen sol-
che Probleme nicht. In einem verteilten System ver-
 Analyse: Grenzen konv. Datenbanken  teilt sich die Last der Zugriffe auf mehrere Server.
‚ Das Volumen der zu speichernden Daten übersteigt
‚ Ausfallssicherheit: Verteilte Datenbanken besitzen
die Speicherkapazität der Datenbank.
eine hohe Ausfallssicherheit.
‚ Die Anzahl der Anwender ist so groß, daß die Ant-
Fällt ein Netzwerkknoten aus, auf dem eine Instanz
wortzeiten des Datenverarbeitungssystems nicht
der verteilten Datenbank ausgeführt wurde, ist nur
mehr akzeptabel sind.
ein Teil des Datenbestand des Systems betroffen.
‚ Bei der Zugriffsbelastung ist gleichzeitig zu beach-
ten, dass Anwender oft zu bestimmten Zeiten enor- ‚ Lokale Strukturierung: Verteilte Datenbanksyste-
me Lastspitzen erzeugen, so daß sich extreme An- me unterstützen die dezentrale Organisations- und
forderungen an die Skalierbarkeit solcher Systeme Unternehmensstrukturen moderner Unternehmen.
ergeben. Gerade in Unternehmen mit vielen, unterschiedli-
‚ Um Datenverlust zu verhindern sollten Daten nicht chen Standorten, ist es sinnvoll Daten ihrer Art und
nur auf einem einzelnen Server gespeichert werden. Nutzung nach, auf mehrere Instanzen der Datenban-
Denn fällt der Server aus, dann können die auf den ken zu verteilen. So liegen an jedem Standort zum
Daten basierenden Geschäftsprozesse nicht mehr ih- Beispiel genau die Daten, die dort benötig werden.
ren Dienst verrichten.
‚ Semantische Strukturierung: Bevor die Daten in
q einer verteilten Datenbank gespeichert werden kön-
nen, müssen sie zuerst auf sogenannte Shards auf-
geteilt werden.

Eine verteilte Datenbank wird z.B.: verwendet um


15.2.2 Verteilte Datenbank die Angestelltendaten eines Unternehmens zu ver-
walten. Dabei wird für jedes Land in dem das Un-
ternehmen eine Niederlassung besitzt eine einzelne
L Verteilte Datenbank  Instanz der Datenbank betrieben. Auf jedem Kno-
Ein Verteiltes Datenbanksystem ist ein Informa- ten werden dabei nur jene Angestellten gespeichert
tionssystem, das auf mehreren Netzwerkkno- die in der entsprechenden Niederlassung arbeiten.
ten ausgeführt werden kann. Die Daten der
q
Datenbank werden in diesem Fall verteilt über
mehrere Knoten hinweg verwaltet.

Verteilte Datenhaltungssysteme bestehen aus


mehreren physisch voneinander getrennten Daten-

132
© Dipl.Ing.-Paul Panhofer Bsc.

15.3. NoSQL Datenbanken  NoSQL Informationssysteme kein einheitliches Da-


tenmodell.
NoSQL Datenbanken wurden aus der Notwendigkeit
heraus entwickelt, große Datenvolumen zu speichern Bevor wir Daten in eine relationale Datenbank ein-
bzw. zu verarbeiten. tragen können, muß die Struktur der Tabellen de-
finiert werden. Im Vergleich dazu müssen für eine
NoSQL Datenbank in der Regel keine Strukturen
definiert bzw. Vorgaben getroffen werden - die Da-
ten werden einfach gespeichert.
15.3.1 NoSQL Grundlagen
‚ Konsistenz vs. Eventual Consistency: Relationa-
le Datenbanken streben vor allem nach Konsistenz.
L NoSQL Systeme  NoSQL Systeme opfern Konsistenz um verfügbar
und ausfallstolerant zu sein.
NoSQL Systeme sind Informationssysteme die
entwickelt wurden um den Herausforderun- Anwender relationaler Datenbanken sehen zu jedem
gen des Bigdata zu begegnen. NoSQL ist ein Zeipunkt des Betriebs die gleichen Daten. Für NoS-
Acronym und steht für not only sql. QL Systeme kann nur garantiert werden dass zu ei-
nem Zeitpunkt in der Zukunft alle Anwender diesel-
ben Daten sehen werden.
NoSQL Systeme haben gemeinsam, dass sie für An-
wendungsfelder optimiert sind, für die das relatio- ‚ Skalierbarkeit: Die Skalierbarkeit eines Systems
nale Datenmodell an seine Grenzen stößt. beschreibt seine Fähigkeit große Mengen von Daten
bzw. Anfragen zur selben Zeit verarbeiten zu kön-
 Erklärung: NoSQL Datenbanken  nen.
‚ Das Acronym NoSQL steht für den englischen Be-
NoSQL Systeme wurden mit dem Anspruch entwi-
griff Not only SQL.
ckelt hoch skalierende Systeme zu sein. Relationale
‚ Bei NoSQL Informationssystemen erkennen wir ei- Datenbanken können im Gegensatz dazu nur sehr
ne Abkehr von starr vorgegeben Datenstrukturen, begrenzt im Bigdata Bereich eingesetzt werden.
wie wir sie in relationalen Systemen vorfinden.
q
‚ Gleichzeitig besitzen NoSQL Datenverarbeitungs-
systeme ein eigenes Konsistenzmodell, daß das
Konsistenzverständnis von RDBM Systemen verein-
facht.

‚ NoSQL Systeme sind kein Ersatz für relationale


Datenbankensysteme.

‚ NoSQL Systeme wurden für spezifische Problemstel-


lungen entwickelt und stellen damit eine Ergänzung
zu relationalen Datenbanken dar.

15.3.2 RDB vs. NoSQL

Zum besseren Verständnis von NoSQL Systemen wol-


len wir NoSQL Systeme mit relationalen Datenbanken
vergeleichen.

 Analyse: Vergleich - RDB vs. NoSQL 


‚ SQL Schema vs. NoSQL schemalos: Während re-
lationale Datenbanken Tabellen mit Spalten und
Zeilen für die Datanspeicherung verwenden, kennen

133
Informationssysteme

16. NoSQL - CAP Theorem 16.1. CAP Theorem 

 CAP Theorem 
Das CAP Theorem zeigt, dass in einem ver-
teilten Datenbanksystem maximal zwei der
folgenden drei Eigenschaften gleichzeitig
gewährleistet sein können.

‚ Consitency: Konsistenz bedeutet, dass al-


le Anwender zum selben Zeitpunkt die glei-
chen Daten sehen.

‚ Availability: Availability bedeutet, dass An-


wender jederzeit Lese- bzw. Schreibzugriffe
durchführen können.

‚ Partition Tolerance: Partition Tolerance be-


deutet, dass die Datenbank auch beim
Ausfall einzelner Knoten als Ganzes weiter-
arbeiten kann.

01. CAP Theorem 134


Das CAP Theorem teilt Informationssysteme, ih-
02. CA Systeme 136 rer Technologie entsprechend in Kategorien. Damit
kann der Anwendungsentwickler je nach Anforde-
03. AP Systeme 137 rung das entsprechende Informationssystem wählen.

04. CP Systeme 137 16.1.1 Eigenschaften von Datenbanken

 Auflistung: Eigenschaften 

 Consistency 
In verteilten Datenbanken, muss sichergestellt
sein, dass nach Abschluss einer Transaktion
alle Replikate eines veränderten Datensatzes
aktualisiert wurden.

r Availability 
Verfügbarkeit beschreibt in erster Linie die Ei-
genschaft eines Infromationssystem bei hoher
Systemlast seinen Dienst aufrechterhalten zu
können.

 Partition Tolerance 
Partition Tolerance bedeutet, dass das System
auch beim Ausfall einzelner Konten als Gan-
zes weiter arbeiten kann.

134
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 37. CAP Theorem

16.1.2 Kategorien von Informationssystemen 16.1.3 Achsenausprägungen

Mit das CAP Theorem wird eine Kategorisierung Jedes Informationssystem kann als Punkt auf ei-
von Informationssystemen definiert. ner der 3 Achsen des CAP Theorems eingetragen
werden.
Jedes Informationssystem läßt sich immer einer,
den durch das CAP Theorem beschriebenen Kate-
gorien zuordnen. L | 
 Analyse: Achsenausprägung 
 Erklärung: Kategorien von IFS 
‚ Die Nähe des Eintrag zu einem der 3 Fixpunkte des
‚ Durch das CAP Theorem werden 3 Kategorien Systems, definiert die Ausprägung der Eigenschaft
für Informationssystemen definiert: CA Systeme, AP im Informationssystem.
Systeme und CP Systeme.
‚ Ausprägung Verfügbarkeit: Die Verfügbarkeit ist
‚ Jedes Informationssystem läßt sie genau einer, den hoch, wenn das System schnell antwortet, und ge-
durch das CAP Theorem definierten Kategorien zu- ring, wenn das System eine hohe Latenzzeit hat.
ordnen. Die durch das CAP Theorem definierten Ka-
tegorien werden auch als die Achsen des CAP Theo- ‚ Ausprägung Konsistenz: In Hinblick auf die Kon-
rems bezeichnet. sistenz bedeutet das, dass diese entweder sofort si-
chergestellt ist oder erst nach einem gewissen Zeit-
‚ Wird ein Informationssystem beispielsweise den fenster der Inkonsistenz.
CA Systemen zugeordnet, kann es graphisch als
Punkt auf der CA Achse visualisiert werden. ‚ Ausprägung Partition Tolerance: Ein System mit
hoher Partition Tolerance wird als Peer to Peer
‚ Die Systemeigenschaften Konsistenz, Verfügbar- System bezeichnet. Jeder der Knoten des System ar-
keit und Ausfallssicherheit sind dabei als graduelle beitet als autonome Einheit. Systeme mit niedriger
Größen zu verstehen. Durch die Visualisierung des Partition Tolerance funktioniern nur wenn alle Kno-
Informationssystems auf einer der 3 Achsen kann die ten des Systems erreichbar sind.
Stärke der Ausprägung der Systemeigenschaft für
das System angegeben werden. q

‚ Wird ein Informationssystem auf der AP Achse na-


he des Availability Fixpunkts abgebildet, handelt es
sich um ein System das in erster Line verfügbar zu
sein hat.

135
Informationssysteme

Abbildung 38. Datenstruktur - Relationalle Datenbanken

16.2. CA Systeme  16.2.2 Beispiele für CA Systeme

SQL Systeme werden zu den CA Systemen gezählt. Die wichtigste Klasse der CA Systeme sind die re-
lationalen Datenbanken.

16.2.1 Theoretische Grundlagen  Analyse: Relationale Datenbanken 


CA Systeme streben vor allem nach Konsistenz. ‚ Die theoretische Grundlage Relationaler Datenban-
ken ist das relationale Datenbankmodell.
 Analyse: CA Eigenschaften 
‚ RDBs sind dir zur Zeit am stärksten verbreitesten
‚ CA Systeme garantieren vor allem eins: Konsis- Datenbanksysteme der IT.
tenz.
‚ RDBs arbeiten mit stark strukturierten8 Daten.
‚ Grundlage dieser Systeme ist das ACID Transak-
tionsmodell. Zugriffe sind stets atomar, konsistent, ‚ Relationale Datenbanken
isoliert und dauerhaft.  MySQL Community Server 8.0.11
‚ Mit der Zahl steigender Netzwerkknoten sinkt die  Microsoft SQL Server 2017
Verfügbarkeit verteilter Datenbanken aufgrund  Oracle Database 12.02
der strengen Konsistenzbedingungen.

‚ Bei CA Systemen sprechen wir in der Regel nicht q


von verteilten Systemen - in einem Netzwerken mit
einem einzelnen Knoten kommt es zu keiner Netz-
werkpartitionierung. 8
Die Struktur der Daten wird durch das System vor-
geschrieben und muß beim Arbeiten mit den Daten ein-
q gehalten werden

136
© Dipl.Ing.-Paul Panhofer Bsc.

16.3. AP Systeme  16.4. CP Systeme 

AP Systeme werden zu den sogenannten NoSQL CP Systeme werden zu den sogenannten NoSQL
Systemen gezählt. Systemen gezählt.

16.3.1 Theoretische Grundlagen L | 


AP Systeme opfern Konsistenz um verfügbar und
ausfallstorlerant zu sein. 16.4.1 Theoretische Grundlagen

CP Systeme reagieren auf eine Netzwerkpartitionie-


 Analyse: Eigenschaften  rung, indem sie auf durchgehende Verfügbarkeit ver-
‚ AP Systeme reagieren auf Netzwerkpartitionie- zichten.
rung, indem sie auf vollständige Konsistenz verzich-
ten.  Erklärung: Eigenschaften 
‚ Alle Teile des Netzwerks reagieren auf Anfragen, ‚ Das Prinzip von CP Systemen ist es jenen Teil
aber die Antworten sind nicht notwendigerweise kon- des Netzwerkes, der konsistent gehalten werden
sistent. kann, verfügbar zu halten, während der Rest igno-
riert wird.
‚ Konnte der Fehler im Netzwerk behoben werden
wird die Konsistenz für alle Netzwerkknoten wie- ‚ CP Systeme sind konsistent und ausfallstolerant.
der hergestellt. ‚ Sobald die Verbindungen zwischen den Knoten
‚ AP Systeme folgen dem BASE Transaktionsmodell. wiederhergestellt ist, wird bei den zuvor nicht ver-
fügbaren Knoten zunächst die Konsistenz wieder-
q hergestellt, erst dann antworten das System wieder
auf Anfragen.
16.3.2 Beispiele für AP Systeme ‚ CP Systeme folgen dem BASE Transaktionsprinzip.

AP Systeme kommen im Big Data Bereich zum q


Einsatz.

 Erklärung: Big Data Anwendungen 


‚ Big Data Anwendugen sind in der Lage große Men-
gen von Daten in kurzer Zeit zu verarbeiten. Die An-
wendung ist dabei über mehrere Knoten eines Netz- 16.4.2 Beispiele für CP Systeme
werks verteilt.
CP Systeme kommen im Big Data Bereich zum
‚ Denken Sie in diesem Zusammenhang an Anwendu- Einsatz.
gen wie Facebook (Cassandra) oder Reddit (Riak).
 Erklärung: Big Data Anwendungen 
 Erklärung: DNS Server 
‚ Big Data Anwendugen sind in der Lage große Men-
‚ DNS Server fallen in die Kategorie der AP Syste- gen von Daten in kurzer Zeit zu verarbeiten. Die An-
me. wendung ist dabei über mehrere Knoten eines Netz-
‚ Die Verfügbarkeit von DNS Servern ist sehr hoch. werks verteilt.

‚ DNS Systeme verfügen im gleichen Maße über eine ‚ NoSQL Systeme sind in der Regel als CP Systeme
hohe Ausfallstoleranz. konzipiert.

‚ Allerdings ist die Konsistenz nicht immer sofort ge- ‚ Bekannte NoSQL Datenbanken sind Google BigTa-
geben: es dauert in der Regel länger, bis ein geän- ble, Apache HBase, MongoDB, Redis, BerkleyDB.
derter DNS Eintrag an die gesamte DNS Hierarchi
q
propagiert werden kann.

137
Informationssysteme

17. NoSQL - Technologien 17.1. Konsistenzmodelle 


Konsistenz beschreibt die Richtigkeit von Daten in
einem Informationssystem.

L Konsistenzmodell 
Das Konsistenzmodell einer Datenbank be-
schreibt auf welche Weise die Konsistenz der
Daten sichergestellt wird.

 Erklärung: Konsistenz 
‚ Kann die Konsistenz von Daten in einem Informa-
tionssystem nicht garantiert werden, verlieren die
Daten des Infromationssystems in der Regel ihren
Wert.
‚ Konsistenzmodelle beschreiben wie die Konsistenz
der Daten des Informationssystems sichergestellt
werden kann.

01. Konsistenzmodelle 138 q

02. Transaktionsattribute 139 17.1.1 Arten von Konsistenzmodellen

03. MVCC 140 Die Entscheidung für ein Konsistenzmodell ist fun-
damental für das Verhalten eines Datenbanksystems
04. Consistent Hashing 141 und für die Gestaltung seiner Architektur.

05. Map Reduce Algorithmus 142 L | 


 Auflistung: Arten von Konsistenzmodellen 

L Strict Consistency 
Alle Anwender sehen immer dieselben Daten.
Alle Leseoperationen liefern den Wert, der die
letzte abgeschlossene Schreiboperation ge-
schrieben hat.

Strict Consistency wird mit der Hilfe der ACID


Transaktionskonzepts umgesetzt.

L Eventual Consistency 
Anwender sehen nicht immer dieselben Da-
ten. Eine Leseoperation liefert eventuell den
zuletzt geschriebenen Wert.

Eventual Consistency wird mit der Hilfe der BA-


SE Transaktionskonzepts umgesetzt.

138
© Dipl.Ing.-Paul Panhofer Bsc.

17.2. Transaktionskonzepte  ‚ Konsistenz: Nach dem Ausführen einer Transaktion


muss der Datenbastand des Informationssystems in
einem konsistenten Zustand sein.
L Transaktion 
‚ Isolation: Bei der gleichzeitigen Ausführung mehre-
Als Transaktion bezeichnet man eine Folge rer Transaktionen dürfen sich diese gegenseitig nicht
von Programmschritten, die als logische Ein- beeinflussen.
heit betrachtet werden. Nach fehlerfreier Aus-
‚ Dauerhaftigkeit: Die Auswirkungen einer Transak-
führung der Transaktion wird der Datenbe-
tion müssen im Datenbestand dauerhaft bestehen
stand in einem konsistenten Zustand hinterlas-
bleiben. Die Effekte von Transaktionen dürfen also
sen.
nicht verloren gehen oder mit der Zeit verblassen.
Daher wird für eine Transaktion insbesondere
q
gefordert, dass sie entweder vollständig und
fehlerfrei oder gar nicht ausgführt wird.

17.2.2 Sperren
Je nach Konsistenzmodell des Informationssystems,
Eine Sperre ermöglicht den exklusiven Zugriff eines
wird ein anderes Transaktionskonzept umgesetzt.
Prozesses auf eine Ressource. Sperren garantieren das
nur ein Prozess eine Ressource liest oder verändert,
 Erklärung: Transaktionskonzepte 
solange die Sperre besteht.
‚ ACID Transaktionskonzept: Strict Consistency
String Consistency Konsistenzmodelle verwenden
‚ BASE Transaktionskonzept: Eventual C.
Sperren um das ACID Transaktionsmodell umzu-
q setzen.
 Analyse: Sperren 
17.2.1 ACID Transaktionskonzept ‚ Die Verwendung von Sperren ist in mehrfacher Hin-
Ein Datenbanksystem ist Strong Consistent wenn das sicht problematisch.
Transaktionsmodell der Datenbank die ACID Eigen- ‚ Der Einsatz von Sperren kann in einer Datenbank
schaften erfüllt. zu langen Wartezeiten führen.
 Auflistung: ACID Eigenschaften  ‚ Besonders in verteilten Datenbanken mit replizier-
‚ Atomarität: Eine Transaktion wird entweder ganz ten Daten verlängert sich der Zeitraum einer Trans-
oder gar nicht durchgeführt. Transaktionen sind da- aktion beim Einsatz von Sperren, da zusätzlich ei-
mit unteilbar. Wenn eine Transaktion abgebrochen ne Sperrung aller replizierter Datensätze zu erfolgen
wird, bleibt das System unverändert. hat.

139
Informationssysteme

17.2.3 BASE Transaktionskonzept 17.3. MVCC 


Das Akronym BASE steht für Basic Availability, Multiversion Concurrency Controll ist ein Verfah-
Soft State und Eventually Consistent. ren für die effiziente, parallele Verarbeitung von Daten.
MVCC verzichtet dabei in Gänze auf Sperren.
Die geänderten Anforderungen an Anwendungen im
Bigdata Bereich motivieren einen neuen Konsistenz-
begriff der gänzlich ohne Sperren auskommt. Wir 17.3.1 MVCC Verfahren
beschreiben eine Datenbank als Eventual Consistent
MVCC wird verwendet um Strong Consistency oh-
wenn das Transaktionsmodell der Datenbank die BA-
SE Eigenschaften erfüllt.
ne den Einsatz von Sperren umzusetzen.

 Erklärung: MVCC Verfahren 


 Auflistung: BASE Eigenschaften 
‚ Jeder Datensatz des Datenbestands wird mit einer
Transaktions ID versehen.
 Basic Availability 
Das Datenbanksystem ist im Sinne des CAP
‚ Jedesmal wenn ein schreibender Zugriff auf einen
Datensatz innerhalb einer Transaktion erfolgt, wird
Theorms grundsätzlich immer verfügbar.
die Transaktions ID des Datensatzes um 1 erhöht.

‚ Bevor ein schreibender Zugriff auf einen Datensatz


L Soft State  erfolgen kann wird die Transaktions ID der Kopie
Die Daten des Datenbanksystems befinden des Datensatzes, die durch die Transaktion im Spei-
sich zeitweise in einem inkonsisteten Zustand. cher gehalten wird, mit der Kopie des Datensatzes,
die in der Datenbank gespeichert ist, vergliechen.

¥ Eventually Consistent  ‚ Nur wenn die Transaktions ID beider Datensätze


identisch ist, erflogt der schreibende Zugriff. Ander-
Nach dem Verständnis von BASE wird die Kon- falls erfolgt ein Rollback innerhalb der Transaktion.
sistenz der Daten als ein Zustand betrachtet,
der irgendwann erreicht wird. ‚ Mit MVCC wird sichergestellt, daß 2 Transaktionen
nicht gleichzeitig schreibenden Zugriff auf den selben
Es wird in Kauf genommen, dass die Daten eine Datensatz haben können.
gewisse Zeit inkonsistent sind.
q

17.2.4 Optimistic Locking

L Optimistic Locking 
Unter Optimistic Locking versteht man eine
Sammlung von Verfahren, die die Konsistenz
von Daten sicherstellen, ohne Sperren zu ver-
wenden.

 Auflistung: Optimistic Locking Verfahren 


‚ Multi Version Concurrency Control

‚ Consistent Hashing

140
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 39. mvcc - Schreiben eines Datensatzes

17.3.2 Diskussion MVCC 17.4. Consistent Hashing 


MVCC hat sich im Bereich der NoSQL Systeme zu
einer Basistechnologie entwickelt, die es ermöglicht,
L Consistent Hashing 
konkurrierende Zugriffe ohne das Sperren von Daten-
sätzen, zu koordinieren. Consistent Hashing ist ein Verfahren zur Vertei-
lung von Datensätzen in einem verteilten Sys-
tem.
L | 
 Erklärung: Diskussion MVCC  17.4.1 Motivation
‚ Für Anwendungen im Big Data Bereich wird im-
plizit vorausgesetzt, dass das Datenbanksystem auf Anwendungen im Bigdata Bereich müssen in der La-
einem verteilten System ausgeführt wird. ge sein, Anfragen hunderttausender von Benutzern,
gleichzeitig zu bearbeiten.
‚ In diesem Umfeld erweist sich der relationale Trans-
aktionsansatz mit dem Sperren von Datensätzen als  Erklärung: Motivation Consistent Hashing 
Haupthindernis.
‚ Um die Anzahl von Anfragen erhöhen zu können die
‚ Zum einen ist der Zeit- und Kommunikationsauf- ein System bearbeiten kann, werden unterschiedliche
wand für eine Übereinkunft, für das Setzen bzw. Caching Verfahren verwendet.
Aufheben einer Sperre immens, zum anderen kann
‚ Horizontal Skalierende Caching Architektur vertei-
auf einen gesperrten Datensatz nicht lesend zuge-
len die Last Benuteranfragen auf mehrere Servern.
griffen werden.
‚ Damit muß jedoch ein neues Problem adressiert wer-
‚ Für genau solche Szenarien wurde das MVCC Ver-
den: Wie können die Daten auf die Server sinnvoll
fahren entwickelt. Die Konsistenz der Daten kann
verteilt werden.
ohne aufwendige Sperrmechanismen sichergestellt
werden. ‚ Eine mögliche Lösung wäre es eine Hash Funktion
zu verwenden.
q
q

141
Informationssysteme

17.4.2 Verteilen von Daten 17.5. Map Reduce Algorithmus 


 Erklärung: Hashing Funktion 
‚ Die einfachste, aber auch naive Lösung ist es eine L Map Reduce 
Hashfunktion zu verwenden. Map Reduce ist ein Programmiermodell für
‚ Für jeden Schlüssel eines zu speichernden Daten- nebenläufige Berechnungen von großen Da-
satzes wird eine Hashfunktion angewandt, die mög-
tenmengen auf Computerclustern.
lichst gleichmäßig verteilte Hashes generiert. Je nach
Hash wird der Datensatz auf einem anderen Server
gespeichert.
L | 
‚ Als Hashfunktion bieten sich dabei schnelle Algo-
rithmen wie MD5 oder CRC32 an.
17.5.1 Algorithmusbeschreibung
‚ Doch was passiert, wenn ein Server ausfällt oder ein
neuer Server hinzugefügt werden muss. Ein großer Beim Map Reduce Verfahren werden die Daten in
Teil der gespeicherten Schlüssel muss neu aufgeteilt 3 Phasen - Map, Shuffle, Reduce - verarbeitet.
werden.
 Erklärung: Algorithmusbeschreibung 
q
‚ Ursprünglich wurde das Map Reduce Verfahren von
Google für das Indexieren von Webseiten entwickelt.
17.4.3 Consistent Hashing ‚ Das Verfahren eignet sich für die Verarbeitung
Hier kommt der Consistent Hashing Algorithmus ins von großen Datenmengen. Die Daten können dabei
Spiel, den er verringert die Neuverteilung von Daten strukturiert als auch unstrukturiert sein.
auf ein Mindestmaß. Damit bleibt das Caching perfor- ‚ Da bei großen Datenmengen einzelne Prozesse
mant, auch beim Ausfall eines oder mehrerer Server. schnell an ihre Grenzen stoßen, parallelisiert Map
Reduce die Bearbeitung, durch die Verteilung auf
 Erklärung: Consistent Hashing  mehrere gleichzeitig auszuführende Tasks.
‚ Consistent Hashing beruht auf einem einfachen
‚ Das Map Reduce Framework sorgt für die Ver-
Prinzip. Das Verfahren arbeitet dabei auf einem vir-
teilung der Aufgaben auf unterschiedliche Rechner
tuellen Ring. Der Ring wird später die Daten und
oder Cluster und aggregiert anschließend die Ergeb-
Server enthalten.
nisse.
‚ Als erstes werden die Server auf dem Ring verteilt.
‚ Der Map Reduce Algorithmus besteht aus 3 Phasen
Die Anordnung kommt dabei durch ein Hashing zu-
- Map,Shuffle und Reduce.
stande.
‚ Die Grundfunktionen des Map Reduce Ansatzes
‚ In der Praxis werden für jeden Server weiter virtu-
sind die beiden Funktionen map() und reduce(). Sie
elle Punkte auf dem Ring erstellt, um die Daten
sorgen für die Zerlegung der Aufgabe in kleine par-
gleichmäßiger verteilen zu können.
allelisierte Arbeitspakete und führen die Ergebnisse
‚ Nun werden nach dem selben Prinzip die Daten ge- anschließend zusammen.
hashed und auf den Ring angeordnet.
‚ Map stellt die Funktion dar, die die Aufgaben an
‚ Was noch fehlt, ist die Zuordnung der Daten zu den die unterschiedlichen Knoten eines Clusters verteilt.
Servern. Für diese Schritt wurden die Daten bereits Die Redcue Funktion sortiert die berechneten Ergeb-
auf dem Ring verteilt. Die Daten werden gegen den nisse und fügt sie wieder zusammen.
Uhrzeigersinn dem jeweiligen Server zugeteilt.
q
q

142
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 40. Map Reduce Algorithmus

17.5.2 Phasenbeschreibung 17.5.3 Diskussion MapReduce

 Auflistung: Map Reduce Phasen   Analyse: Map Reduce 


‚ Map Phase: In der Map Phase werden die Eingabe- ‚ MapReduce wird im BigData Umfeld für beispiels-
daten auf eine Menge von Map Prozessen verteilt, weise Finanzanalyse, wissenschaftliche Simulation
welche jeweils die vom Nutzer bereitgestellte Map oder Data Mining verwendet.
Funktion berechnen.
‚ Gegenüber den klassischen Verfahren der Datenver-
Map Prozesse werden idealerweise parallel ausge- arbeitung, wie sie in relationalen Datenbanken zum
führt. Einsatz kommen, bietet MapReduce eine ganze Rei-
he von Vorteilen.
‚ Shuffle Phase: Die Zwischenergebnisse der Map
Phase werden gemäß der Ausgabeschlüssel, die von ‚ Durch die parallele Verarbeitung ist MapReduce
der Map Funktion produziert wurden, neu ver- sehr schnell und wesentlich performanter als die Da-
teilt, sodass alle Zwischenergebnisse mit demselben tenverarbeitung in relationalen Datenbanken.
Schlüssel im nächsten Schritt auf demselben Com- ‚ Das Verfahren eignet sich sehr gut für die
putersystem verarbeitet werden. Batch Verarbeitung von großen unstrukturierten,
‚ Reduce Phase: Für jeden Satz von Zwischenergeb- semistrukturierten und nicht normalisierten Daten.
nissen berechnet jeweils genau ein Reduce Prozess ‚ Für das MapReduce Konzept existieren mittlerwei-
die vom Nutzer bereitgestellte Reduce Funktion und le viele Implementierungen. Eine der erfolgreichs-
damit die Ausgabedaten. ten und am stärksten verbreiteten ist das Hadoop
Framework.
Die Reduce Prozesse werden idealerweise ebenfalls
parallel ausgeführt. q

143
Informationssysteme

. .

144
Informationssysteme - Theorieskriptum
.

MongoDB
Version 2018.09.01
Informationssysteme

18. MongoDB - Modellierung 18.1. MongoDB 

MongoDB ist ein populäres Informationssystem im


Bigdata Bereich.

18.1.1 MongoDB Motivation

Relationale Datenbanken wurden jahrzehntelang als


einzige Möglichkeit zur Archivierung und Verwaltung
elektronischer Daten im IT Bereich angesehen.

 Analyse: NoSQL Datenbanken 


‚ Spricht man von herkömmlichen Datenbanken,
meint man zumeist die vom britischen Mathemati-
ker Edgar F. Codd entwickelten relationalen Da-
tenbanken.

‚ In Tabellen, die üblicherweise aus mehreren Zeilen


und Spalten bestehen, werden Werte gespeichert.
Die Spalten bieten Platz für Attribute wie Vorname
oder Nachname. In den Zeilen werden diese dann mit
01. MongoDB 146 konkreten Werten gefüllt.

‚ Dieser Ansatz hat jedoch einen Nachteil: Das Sche-


02. Modellierungsprinzipien 148 ma muss von Anfang an feststehen. Es muss also
beim Anlegen einer Tabelle bereits festgelegt wer-
den, wie viele und welche Spalten es geben wird.

‚ Solche und ähnliche Fragen sind für einfache Anwen-


dungen noch schnell zu lösen sein, in komplexeren
Projekten kann dieser starre Ansatz jedoch ebenso
schnell in eine Sackgasse führen. Häufig lassen sich
Millionen unterschiedlicher Datensätze nicht in ein
einziges starres Schema zwängen.

‚ Wesentlich signifikanter wiegt jedoch der Perfor-


manceverlust, der bei relationalen Datenbanken un-
weigerlich eintritt, je mehr Daten in der Datenbank
verwaltet werden müssen.

Zum Vergleich: Sammeln sich in einer MySQL-


Datenbank mehr als 50 GB Daten an, liegt die
durchschnittliche Schreib- bzw. Lesegeschwindigkeit
nur noch bei ca. 300 ms. Bei der gleichen Datenmen-
ge braucht eine dokumentorientierte Datenbank wie
MongoDB nur wenige Millisekunden.

18.1.2 Skalierbarkeit von Datenbanken

Datenbanksysteme müssen in der Lage sein Benut-


zeranfragen parallel verarbeiten zu können.

146
© Dipl.Ing.-Paul Panhofer Bsc.

18.1.4 Codebeispiel: Project Dokument


L Skalierbarkeit 
JSON als Datenformat ist einfach verständlich und
Skalierbarkeit bezeichnet die Fähigkeit ei-
kann schnell verarbeitet werden.
nes Systems mit wachsender Systemlast seinen
Dienst aufrecht halten zu können.  Codebeispiel: Project Document 
1 //-----------------------------------------
Skalierbarkeit beschreibt damit die Möglichkeit ei-
2 // Project
ner Datenbank eine große Zahl von Benutzeranfra-
3 //-----------------------------------------
gen parallel verarbeiten zu können.
4 var project = {
 Erklärung: Skalierbarkeit  5 _id : ObjectId("3432465df43452"),
‚ Dokumentorientierte Datenbanken verdanken ihre 6 type : "RESEARCH_FUNDING_PROJECT",
herausragenden Skalierungseigenschaften, ihrer Fä- 7 title : "Motorsimulations",
higkeit den Datenbestand auf mehrere Netzwerk- 8 description: "Der Vorteil dynamischer
knoten verteilen zu können. Bei zu vielen Benut- 9 Simulation ist es, die
zeranfragen kann die Serverlast damit einfach auf 10 Wechselwirkung vom ..."
zusätzliche Netzwerkknoten verteilt werden. 11 begin_date : new Date(’Jun 23, 2016’),
12 project_stuff : [{
‚ Relationale Datenbanken können im Gegensatz dazu 13 first-name : "Roman",
nur skaliert werden indem der Netzwerkknoten auf 14 last-name : "Arthaber",
dem die Datenbank installiert ist hardwaretechnisch 15 role : "PROJECT_MANAGER"
zu verbessern. 16 },{
17 first-name : "Nikola",
Relationale Datenbanken sind damit nur beschränkt
18 last-name : "Cacarjevic",
skalierbar.
19 role : "Programmer"
q 20 }],
21 fundings : [{
22 debitor : "SAP Inc. Systems",
18.1.3 Datenformat: JSON 23 partner_name : "Hr. Dipl.Ing.-
Dokumentorientierte Datenbanken können Datensätze Kirchner",
in unterschiedlichen Datenformaten speichern. 24 funding_amount : NumberLong(34000000)
25 }, {
Für viele Dokumentorientierte System, besonders 26 debitor : "FWF Programm",
MongoDB, stellt JSON das Datenformat erster 27 partner_name : "Hr. Dipl.Ing.-
Wahl dar. Lobensky",
28 funding_amount : NumberLong(5000000)
 Erklärung: JSON Datenformat 
29 }],
‚ Mit dem Einsatz des JSON Datenformat zur Spei- 30 subprojects : [{
cherung von Datensätzen, gibt MongoDB Program- 31 title : "Simulation Programming",
mieren die Möglichkeit an die Hand alle Teile 32 description : "Programming principles
der Anwendungsentwicklung in einer einzelnen Pro- in ...",
grammiersprache - JavaScript - umzusetzen. 33 state : "IN_PREPARATION",
‚ Im Anwendungscode werden Daten als Objekte bzw. 34 begin_date : new Date(’Jun 23, 2016’)
JSON-ähnliche Dokumente dargestellt, weil dieses 35 }, {
Datenmodell für Entwickler effizient zu nutzen und 36 title : "Simulation Modells",
intuitiv zu bedienen ist. 37 description : "Finite Mathematics in
..",
‚ Mit Dokumentdatenbanken können Entwickler Da- 38 state : "IN_PREPARATION",
ten einfacher in einer Datenbank speichern und ab- 39 begin_date : new Date(’Jun 23, 2016’)
fragen, indem sie das gleiche Dokumentmodellfor- 40 }]
mat wie in ihrem Anwendungscode verwenden. 41 }
q
q

147
Informationssysteme

18.2. Modellierungsprinzipien  18.2.2 Hierarchische Datenmodell

Im hierarchischen Datenmodell werden Geschäftsob-


Die Dokumentbasierte Modellierung folgt anderen
jekte nicht in ihre Aspekte zersplittert sondern als Gan-
Prinzipien als die relationale Modellierung.
zes gespeichert.

 Erklärung: Hierarchische Datenmodell 


18.2.1 Modellierungsprinzipien
‚ Datensätze im hierarchischen Datenmodell haben
Folgende Modellierungsprinzipien sind in Dokument- die Struktur eines Baums.
orientierten Datenbanksystemen vorherrschend.
‚ Die Grunddaten des Datensatz werden im Wurzel-
element des Dokuments gespeichert.
 Auflistung: Modellierungprinzipien 
‚ Alle andereren Daten werden als Kindelement des
L Aggregation  Wurzelelements, im selben Dokument gespeichert.

In dokumentbasierten Systemen werden in  Codebeispiel: TV Show Document 


Beziehung stehende Daten in einem einzel-
1 //------------------------------------------
nen Dokument verdichtet. Im Gegensatz zum
2 // TV Show Dokument
Relationalen Modell werden Geschäftsobjek-
3 //------------------------------------------
te nicht in ihre Aspekte aufgeteilt sondern als
4 var tvshow = {
Einheit gespeichert.
5 // Grunddaten
6 title : "The Lord of the Rings",
n Relationfree  7 description : "The Lord of the Rings is
8 an epic high fantasy novel wirtten
Vermeiden Sie Beziehungen zwischen Doku- 9 by English author J.R.R. Tolkien.",
menten. 10 // Kindelemente
11 seasons : [{
Ist es für eine Anwendung notwendig Bezie-
12 subtitle : "The Fellowship",
hungen zwischen Dokumenten zu definieren,
13 season_id : 1,
sollte die Modellierung der Daten überdacht
14 episodes : [{
werden.
15 title : "The Shire",
16 episode_n : 1,
< Duplication  17 cast_members:[{
18 role : "Frodo Baggins",
Im hierarchischen Datenmodell können die- 19 actor : "Elaja Woods"
selben Daten mehrmals gespeichert werden. 20 }, {
Das hierarchische Datenmodell kennt keine 21 role : "Gandalf the Grey",
Normalformen. 22 actor : "Sir Ian McKenitt"
Datenredundanz ist akzeptabel. 23 }, {
24 role : "Aragorn",
25 actor : "Viggo Mortensen"
 Hierarchical  26 }, {
27 role : "Aragorn",
Datensätze in Dokumentorientierten Syste-
28 actor : "Viggo Mortensen"
men sind hierarchisch aufgebaut.
29 }, {
Ein Personendatensatz wird beispielsweise 30 role : "Bilbo Baggins",
den Namen und andere personenbezogene 31 actor : "Joseph Shire"
Daten auf höchster Ebenen speichern. Kon- 32 }]
taktdaten werden als Subdokument einge- 33 }]
fügt. 34 }]
35 }

q
q

148
© Dipl.Ing.-Paul Panhofer Bsc.

Designentscheidung Fragestellung

Geschäftsobjekte Welches sind die zentralen Geschäftsobjekte des fachlichen Modells?


Koppelung In welcher Weise sind die Geschäftsobjekte miteinander gekoppelt?
Kardinalität Wie gestaltet sich die Kardinalität der Beziehungen der Daten innerhalb eines
Dokuments?
Abfragen Welches sind die prominenten Abfragen und für welche Geschäftsobjekte werden sie
durchgeführt?
Operationen In welchem Verhältnis stehen Schreib- und Leseoperation für bestimmte
Geschäftsobjekte?

Abbildung 41. Designentscheidungen Schemadesing

18.2.3 Modellstruktur 18.2.4 Schemafreie Modellierung

L Schemadesign  L Schemafreiheit 
Schemadesign beschreibt den Prozess der Schemafreiheit beschreibt die Eigenschaft ei-
Abbildung des fachlichen Modells auf das nes Informatinssystems Datensätze beim Einfü-
physikalische Modell eines Informationssys- gen bzw. Ändern keiner Strukturprüfung zu un-
tems. terziehen.

Schemafreiheit beschreibt keine Modellierungstech-


 Erklärung: MongoDB Struktur  nik sondern einen technischen Aspekt eines Informa-
‚ MongoDB speichert Datensätze in Form von Doku- tionssystems.
menten. Strukturell ähnliche Dokumente werden da-
bei in Collections zusammengefaßt.  Analyse: Schemafreie Modellierung 
‚ Schemafreiheit war eine der Entscheidungen der
‚ Eine Collection kann konzeptionell mit einer Tabel-
Architekten des MongoDB Servers um die Skalier-
le eines relationalen Datenbanksystems verglichen
barkeit der Datenbank im Big Data Bereich sicher-
werden. Grundsätzlich kann eine Collection jedoch
zustellen.
Dokumente unterschiedlicher Struktur enthalten.
‚ Die Validierung der Struktur und der Daten eines
‚ Dokumente können Arrays und eingebettete Doku-
Datensatzes, gegen das Schema einer Collection ist
mente enthalten. In einem Dokument können gesam-
mit einem bestimmten Aufwand verbunden.
te Objektgraphen gespeichert werden.
‚ Aus fachlicher Sicht macht es jedoch keinen Sinn,
‚ Referenzen auf Dokumente in andere Collections
Geschäftsobjekte unreflektiert in einer Collection
sind möglich.
zu speichern. Alle Dokumente einer Collection soll-
q ten eine gemeinsame Basis von Attributen haben
die die Zugehörigkeit des Dokuments zur Collecti-
on rechtfertigt.

‚ Schemafreiheit erlaubt es dem Datenbankentwickler


Änderungen der fachlichen Anforderungen einfach in
die Datenbank einzuarbeiten.

149
Informationssysteme

19. MongoDB - DDL 19.1. Datenkontainer 


Die MongoDB Datenbankengine verwaltet Sammlun-
gen von Dokumenten in logischen Namensräumen.

19.1.1 Datenkontainer

Zur Verwaltung von Daten definiert die MongoDB Spe-


zifikation 5 Typen von Datenkontainern.

Datenkontainer werden zur Strukturierung und


Verwaltung von Daten verwendet.

 Auflistung: Datenkontainer 

 Database 
In der Theorie versteht man unter einer Da-
tenbank einen logisch zusammenhängenden
Datenbestand. Die Datenbank ist in diesem
Sinne ein logischer Namensraum für die Col-
lecions eines Geschäftsfalls.
01. Datenkontainer 150

02. Datenkontainer anlegen 151 < Collection 


Collections verwalten Sammlungen gleichar-
03. Collections und Dokumente 152
tiger Dokumente.

04. Dokumentschema 154 Collections können dabei konzeptionell mit


den Tabellen Relationaler Datenbanken ver-
05. Schemaelemente 156 glichen werden.

06. Views ersetllen 158


ü View 
07. Datencontainer verwalten 159 Views sind Sichten auf Collections. Wie in rela-
tionalen Datenbanken erlauben Views ledig-
lich einen lesenden Zugriff auf den Datenbe-
stand.

r Capped Collection 
Eine Capped Collection ist eine Collection die
strukturell wie ein Ringbuffer aufgebaut ist. Sie
wird verwendet um große Mengen von Daten
schnell verarbeiten zu können.

n Document 
MongoDB speichert Datensätze in Form von
Dokumenten gespeichert.

150
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 42. Dokumente einer Collection

19.2. Datenkontainer anlegen  19.2.2 Collections explizit anlegen

Zum expliziten Anlegen von Collections definiert die


MongoDB Spezifikation den createCollection Befehl.
L Database 
Eine Datenbank dient als logischer Namens-  Codebeispiel: createCollection 
raum für die enthaltenen Collections. 1 // ----------------------------------------
2 // Syntax: createCollection
3 // ----------------------------------------
19.2.1 Datencontainer implizit anlegen 4 db.createCollection(
5 name : <String>,
Die MongoDB Datenbankengine verwendet JavaScript
6 option : <Document>
als Abfrage- und Datenbanksprache.
7 );
Beim Ausführen der folgenden Befehle werden Da- 8

tencontainer implizit angelegt. 9

10 db.createCollection(<name>, {
 Codebeispiel: Datenbanken implizit anlegen  11 capped : <boolean>,
1 // ---------------------------------------- 12 autoIndexId : <boolean>,
2 // Datencontainer implizit anlegen 13 size : <number>,
3 // ---------------------------------------- 14 max : <number>,
4 // Mit dem <use> Befehl wird der Kontext 15 storageEngine : <document>,
5 // der angegebenen Datenbank geladen. 16 validator : <document>,
6 // Existiert die Datenbank nicht wird sie 17 validationLevel : <string>,
7 // angelegt. 18 validationAction : <string>,
8 use persons; 19 indexOptionDefaults : <document>,
9
20 viewOn : <string>,
10 // Mit dem insertOne Befehl wird ein Doku- 21 pipeline : <pipeline>,
11 // ment in eine Collection geschrieben. 22 collation : <document>,
12 // Existiert die Collection nicht wird 23 writeConcern : <document>
13 // sie implizit angelegt. 24 });
25
14 db.projects.insertOne({
26
15 type : "REQUEST_FUNDING_PROJECT"
16 }); 27 db.createCollection("projects");

q q

151
Informationssysteme

Parameter Beschreibung Typ

capped Optional. To create a capped collection, specify true. If you specify true, you must boolean
also set a maximum size in the size field.

autoIndexId Optional. Specify false to disable the automatic creation of an index on the _id boolean
field.

size Optional. Specify a maximum size in bytes for a capped collection. Once a cap- number
ped collection reaches its maximum size, MongoDB removes the older documents
to make space for the new documents. The size field is required for capped col-
lections and ignored for other collections.

max Optional. The maximum number of documents allowed in the capped collection. number
The size limit takes precedence over this limit. If a capped collection reaches the
size limit before it reaches the maximum number of documents, MongoDB remo-
ves old documents. If you prefer to use the max limit, ensure that the size limit,
which is required for a capped collection, is sufficient to contain the maximum
number of documents.

validator Optional. Allows users to specify validation rules or expressions for the collection. document
For more information, see Schema Validation.

validationLevel Optional. Determines how strictly MongoDB applies the validation rules to existing string
documents during an update.

validationAction Optional. Determines whether to error on invalid documents or just warn about string
the violations but allow invalid documents to be inserted.

viewOn The name of the source collection or view from which to create the view. The string
name is not the full namespace of the collection or view; i.e. does not include the
database name and implies the same database as the view to create.

pipeline An array that consists of the aggregation pipeline stage. db.createView creates array
the view by applying the specified pipeline to the viewOn collection or view.

writeConcern Optional. A document that expresses the write concern for the operation. Omit to document
use the default write concern.

Abbildung 43. createCollection

19.3. Collections und Dokumente   Erklärung: BSON Datenformat 


‚ BSON ist ein binäres Datenformat zur Speicherung
semistrukturierter Daten.
L Collection 
‚ Das BSON Datenformat kann im Vergleich zu JSON
Collections verwalten Sammlungen gleicharti-
schneller von der MongoDB Datenbankengine ver-
ger Dokumente.
arbeitet werden.

Die Datenbankengine speichert Datensätze in Form ‚ BSON Dokumente speichern Daten dabei in Form
von BSON Dokumenten. von Key - Value Paaren.

‚ Für die Namen der Attribute eines Dokuments müs-


19.3.1 BSON Datenformat sen folgende Restriktionen eingehalten werden: Der
Name _id darf nur für das Schlüsselfeld des Do-
Das BSON Datenformat ist eine Variation des JSON kuments verwendet werden. Attributnamen dürfen
Datenformats. nicht mit dem $ Zeichen beginnen.

152
© Dipl.Ing.-Paul Panhofer Bsc.

BSON Typ Beschreibung Key Value Paar im Dokument

object BSON Objekt field : {...}

array Eine Array speichert eine Liste beliebiger field : [...]


Werte

string UTF 8 codierte Zeichenkette field : "hallo Mongo"

double 64 Bit Gleitkommazahlen field : Math.PI

long 64 Bit Integer field : NumberLong(32353423)

int 32 Bit Integer mit Vorzeichen field : NumberInt(45)

bool Datantyp für Wahrheitswerte field : true

objectId Eine 12 Byte lange ID zur Identifikation des field : ObjectId("312G64AC6543233F3232902")


Dokuments: 24 Bit Hexadecimalzahl

Abbildung 44. BSON Datentypen

 Codebeispiel: BSON Dokument  19.3.2 Eingebettete Objekte


1 //-----------------------------------------
2 // BSON Dokument L Embedded Docoument 
3 //-----------------------------------------
4 var project = { In einem BSON Objekten können andere Ob-
5 // Das _id Attribut darf nur zur Spei- jekte gespeichert werden. Eingebettete Ob-
6 // cherung der ID des Dokuments ver- jekte werden als Embedded Objects bezeich-
7 // wendet werden. Eine ID ist eine 24 net.
8 // bit Hexadcimalzahl
9 _id : ObjectId("5099803df3f4948bd1"), Eingebettete Objekte können über den Punktope-
rator referenziert werden.
10 title: "Motorsimulation"
11
 Codebeispiel: embedded documents 
12 // Das contact Feld referenzier ein einge-
1 //-----------------------------------------
13 // bettetes Objekt
2 // embedded document
14 contact : { first: "Alan", last: "Tur" },
3 //-----------------------------------------
15 type : "REQUEST_FUNDING_PROJECT",
4 var project = {
16 begin : new Date(’Jun 23, 1995’),
5 _id : ObjectId("5099803df3f4948bd2"),
17 state : "APPROVED",
6 type : "REQUEST_FUNDING_PROJECT",
18
7 contact : {
19 // contribs speichert ein Liste von
8 name : "Fabricio Caprese",
20 // Zeichenketten
9 phone : {
21 contribs: [
10 number : "111-222-3333"
22 "Turing machine",
11 }
23 "Turing test"
12 }
24 ],
13 }
25
14
26 views : NumberLong(1250000)
15 //Zugriff auf Felder
27 }
16 project.contact.phone.number

q
q

153
Informationssysteme

19.4. Dokumentschema  19.4.2 Schemaattribute

Schemafreiheit beschreibt die Eigenschaft eines Infor- Ein BSON Schema selbst ist wieder ein BSON Doku-
mationssystems, Datensätze beim Einfügen bzw. Än- ment.
dern keiner Strukturprüfung zu unterziehen. Zur Definition eines BSON Schemas gibt die Schema
Spezifikation eine Zahl von Attributen vor.
19.4.1 BSON Schema
 Auflistung: Schemaattribute 
In der Regel können Anwendungen Daten nur dann
‚ bsonType: Das bsonType Attribut definiert den
verarbeiten, wenn sie eine bestimmte Struktur aufwei-
Typ des Dokuments bzw. den Typ im Dokument
sen.
enthaltener Felder.
Die BSON Schema Spezifikation ist ein technischer
Standard zur Beschreibung der Struktur von BSON
‚ required: Mit dem required Attribut wird angege-
ben, welche Felder ein Dokument umbedingt enthal-
Dokumenten.
ten muss.
 Erklärung: BSON Schema 
‚ properties: Das properties Attribut wird verwen-
‚ Aus fachlicher Sicht macht es keinen Sinn, Ge-
det, um für die Felder des Dokuments Constraints
schäftsobjekte unreflektiert in einer Collection zu
zu definieren.
speichern.
 Codebeispiel: Schemaattribute 
‚ Mit einem BSON Schema kann definiert werden, wie
ein Dokument aufgebaut sein muss, um in eine Col- 1 //-----------------------------------------
lection eingetragen werden zu können. 2 // BSON Dokument
3 //-----------------------------------------
 Codebeispiel: BSON Schema  4 var person = {
1 //----------------------------------------- 5 _id : ObjectId("5099803df3f4948391"),
2 // BSON Dokument 6 firstName : "Alan",
3 //----------------------------------------- 7 lastName : "Turning",
4 var project = { 8 contribs : [ "Turing machine", "test" ],
5 title : "Motorensimulation", 9 major : [ "Math" ]
6 type : "REQUEST_PROJECT", 10 }
11
7 views : 10000
8 }; 12 //-----------------------------------------
9
13 // BSON Schema
10 //----------------------------------------- 14 //-----------------------------------------
11 // BSON Schema 15 var personSchema = {
12 //----------------------------------------- 16 bsonType : "object",
13 var projectSchema = { 17 required : [ "major", "lastName" ],
14 bsonType : "object", 18 properties : {
15 required : ["title", "views"], 19 contribs : {
16 additionalProperties : true; 20 bsonType : ["string"]
17 properties : { 21 },
18 title : { 22 major : {
19 bsonType : "string", 23 enum : [ "Math", "English" ]
20 maxLength : 100 24 },
21 }, 25 lastName : {
22 views : { 26 bsonType : "string",
23 bsonType : "int", 27 maxLength : 50,
24 } 28 description: "... "
25 } 29 }
26 }; 30 }
31 }
q
q

154
© Dipl.Ing.-Paul Panhofer Bsc.

Keyword Definition Behavior Type

bsonType string alias Definiert den Typ des Feldes all types

enum array of values Definiert alle möglichen Werte für ein Feld. all types

multipleOf number Field must be a multiple of this value numbers

maximum number Indicates the maximum value of the field numbers

exclusiveMaximum boolean If true and field is a number, maximum is an exclusive maxi- numbers
mum. Otherwise, it is an inclusive maximum.

minimum number Indicates the minimum value of the field numbers

exclusiveMinimum boolean If true and field is a number, minimum is an exclusive mini- numbers
mum. Otherwise, it is an inclusive minimum.

maxLength integer Indicates the maximum length of the field strings

minLength integer Indicates the minimum length of the field strings

pattern regex string Field must match the regular expression strings

required array of strings Object’s property set must contain all the specified ele- objects
ments in the array

additionalProperties boolean or object If true, additional fields are allowed. If false, they are not. If objects
a valid JSON Schema object is specified, additional fields
must validate against the schema.

items bson type Definiert den Typ der Elemente die im Array gespeichert arrays
werden

maxItems integer Indicates the maximum length of array arrays

minItems integer Indicates the minimum length of array arrays

uniqueItems boolean If true, each item in the array must be unique. Otherwise, arrays
no uniqueness constraint is enforced.

title string A descriptive title string with no effect N/A

description string A string that describes the schema and has no effect. N/A

Abbildung 45. BSON Schema Attribute

. .

155
Informationssysteme

19.5. Schemaelemente  19.5.2 Schemaelement: Enum

19.5.1 Schemaelement: Eingebettete Objekte L Aufzählungstyp 

Für in Objekte eingebettete Objekte erfolgt die Sche- Ein Aufzählungstyp ist ein Datentyp mit festge-
madefinition in rekursiver Weise. legten Wertemöglichkeiten.

Enums werden verwendet um die logische


 Codebeispiel: Eingebettete Objekte  Struktur und Lesbarkeit von Programmen zu
1 //----------------------------------------- verbessern.
2 // BSON Dokument
3 //-----------------------------------------
4 var person = {  Erklärung: Aufzählungstypen 
5 _id : ObjectId("5099803df3f4948b91"), ‚ Zur Definition eines Enums, müssen im Schema al-
6 firstName : "Alan", le zulässigen Werte des Aufzählungstyps angeführt
7 address : { werden.
8 country : "Austria",
‚ Dabei kann auch eine Reihenfolge festgelegt wer-
9 location : "1040 Vienna",
den, die eine Ordnung der einzelnen Werte be-
10 street : "Taubstummengasse 11"
stimmt.
11 }
12 };  Codebeispiel: Enums 
13
1 //-----------------------------------------
14 //----------------------------------------- 2 // BSON Dokument
15 // BSON Schema 3 //-----------------------------------------
16 //----------------------------------------- 4 var project = {
17 var personSchema = { 5 name : "Computer Simulation",
18 bsonType : "object", 6 code : "A-33434-ZTU"
19 required : ["firstName", "address"], 7 projectType : "REQUEST_PROJECT"
20 properties : { 8 };
21 first_name : { 9
22 bsonType : "string", 10 //-----------------------------------------
23 description : "..." 11 // BSON Schema
24 }, 12 //-----------------------------------------
25 address : { 13 var projectSchema = {
26 bsonType : "object", 14 bsonType : "object",
27 required : [ 15 required : [
28 "country", "street" 16 "name", "code", "projectType"
29 ], 17 ],
30 properties : { 18 properties : {
31 country : { 19 name : {
32 bsonType : "string", 20 bsonType : "string",
33 minLength : 2, 21 },
34 maxLength : 100 22 projectType : {
35 }, 23 enum : [
36 street : { 24 "REQUEST_PROJECT",
37 bsonType : "string" 25 "RESEARCH_PROJECT",
38 } 26 "MANAGEMENT_PROJECT"
39 } 27 ]
40 } 28 }
41 } 29 }
42 }; 30 };

q q

156
© Dipl.Ing.-Paul Panhofer Bsc.

19.5.3 Schemaelment: Array 19.5.4 Arrays von Objekten

Arrays fassen mehrere gleichartige Werte zu einer Col- Zur Definition eines Arrays von Objekten muß das
lection zusammen. items Attribut verwendet werden.

 Erklärung: Arraydefinition 
 Codebeispiel: Arrays von Objekten 
‚ Der BSON Typ eines Arrays ist array. Zur Defi- 1 //-----------------------------------------
nition eines Arrays muß zusätzlich die Art und der 2 // BSON Dokument
Aufbau der Arrayelemente angegeben werden. 3 //-----------------------------------------
‚ Im Schema wird dazu das items Attribut verwendet. 4 var project = {
5 title : "Simulationssoftware",
6 subprojects : [{
 Codebeispiel: Arrayschema 
7 title : "Finite Elemente"
1 //----------------------------------------- 8 isFWFFunded : true,
2 // BSON Dokument 9 isFFGFunded : false
3 //----------------------------------------- 10 }],
4 var point = { 11 fundings : [{
5 location : [3, 2, 5], 12 debitor : "TU Wien",
6 props : [ 13 amount : NumberLong(100000)
7 "value coordinate", 14 },{
8 "xyz values", 15 debitor : "Simens AG.",
9 ], 16 amount : NumberLong(250000)
10 description : "pipeline point" 17
11 }; 18 }]
12
19 };
13 //----------------------------------------- 20
14 // BSON Schema 21 //-----------------------------------------
15 //----------------------------------------- 22 // BSON Schema
16 var pointSchema = { 23 //-----------------------------------------
17 bsonType : "object", 24 var projectSchema = {
18 required : [ 25 bsonType : "object",
19 "location", "props", "dimension" 26 required : [ "title", "subprojects" ],
20 ], 27 properties : {
21 properties : { 28 subprojects : {
22 location : { 29 bsonType : "array",
23 bsonType : "array", 30 items : {
24 minItems : 1, 31 bsonType : "object",
25 maxItems : 4, 32 required : ["title"],
26 items : { 33 properties : {
27 bsonType : "int" 34 title : {
28 } 35 bsonType : "string",
29 }, 36 maxLength : 100
30 props : { 37 },
31 bsonType : "array", 38 isFwfFunded : {
32 maxItems : 3, 39 bsonType : bool
33 items : { 40 }
34 bsonType : "string" 41 }
35 } 42 }
36 } 43 }
37 } 44 }
38 }; 45 }

q q

157
Informationssysteme

19.5.5 Collection mit Schemavalidation 19.6. Views erstellen 


Sollen Dokumente beim Einfügen in eine Collection ei-
ner Strukturprüfung unterzogen werden, muss beim 19.6.1 Views
Anlegen der Collection eine Schemabeschreibung defi-
niert werden. L View 
 Auflistung: Attribute  Views sind Sichten auf Collections.
‚ validationLevel: Das validationLevel Attribut de-
finiert den Validierungslevel einer Collection. Auf Views können nur Leseoperationen ausgeführt
werden.
‚ strict: Für inserts bzw. updates wird eine
Strukturprüfung durch die Datenbankengine an-  Codebeispiel: View anlegen 
gestossen. 1 //-----------------------------------------
‚ moderate: Für bereits gespeicherte Dokumente 2 // Syntax: createView
erfolgt keine Validierung. Ansonsten gelten die 3 //-----------------------------------------
strict Regeln. 4 db.createView(<view>, <source>);
5

‚ validationAction: Das validationAction Attribut 6 db.createView("students", "persons");


definiert das Verhalten der Datenbankengine im Fal- 7

le des Fehlschlagens der Strukturprüfung. 8 //-----------------------------------------


9 // Syntax: createCollection
‚ error: Ungültige Dokumente werden nicht in
10 //-----------------------------------------
die Datenbank eingetragen. Die Datenbanken-
11 db.createCollection(
gine antwortet mit einem Fehler.
12 "persons", {
‚ warn: Für ungültige Dokumente wird eine War- 13 validationLevel : "strict",
nung ausgegeben. Das Dokument wird jedoch 14 validationAction : "error",
trotzdem in die Collection geschrieben. 15 validator : {
16 $jsonSchema : {
 Codebeispiel: Collection anlegen  17 bsonType : "object",
1 //----------------------------------------- 18 required : ["name",
2 // Collection mit Validierung anlegen "birth"],
3 //----------------------------------------- 19 additionalProperties : true,
4 db.createCollection( "persons", 20 properties : {
5 { 21 name : {
6 validationLevel : "strict", 22 bsonType :
7 validationAction : "error", "string",
8 validator : { 23 minLength : 3,
9 $jsonSchema : { 24 maxLength : 50
10 bsonType : "object", 25 }
11 required : ["name"], 26 birth : {
12 properties : { 27 bsonType : "date",
13 name : { 28 },
14 bsonType : "string", 29 contribs : {
15 maxLength : 50, 30 bsonType :
16 description : "..." ["string"]
17 } 31 }
18 } 32 }
19 } 33 }
20 } 34 }
21 } 35 }
22 }; 36 }

q q

158
© Dipl.Ing.-Paul Panhofer Bsc.

19.7. Datencontainer verwalten  .

19.7.1 Container verwalten

Wir wollen zum Schluß noch die wichtigsten Methoden


zur Verwaltung von Datencontaineren angeben.

 Codebeispiel: Container verwalten 


1 //-----------------------------------------
2 // Syntax: getCollection()
3 //-----------------------------------------
4 db.getCollection(<string>);
5

6 var personColl = db.getCollection("persons");


7

8 personColl.insertOne({
9 birth : new Date(’Jun 23, 1912’),
10 death : new Date(’Jun 07, 1954’),
11 views : NumberLong(1250000),
12 user_name : "turing",
13 email : "alan.turing@berkley.com",
14 phone : "0664/3452372",
15 url : "http://www.htlkrema.at"
16 });
17

18 //return value
19 var returnValue = {
20 "acknowledged" : true,
21 "insertedId" : ObjectId("569525e144f63")
22 }
23

24 //-----------------------------------------
25 // Syntax: getCollectionNames()
26 //-----------------------------------------
27 //return all collections
28 db.getCollectionNames();
29

30 use school;
31 db.getCollectionNames();
32

33 //return value
34 var returnValue = ["persons", "teachers",
"students"]
35

36 //-----------------------------------------
37 // Syntax: drop()
38 //-----------------------------------------
39 db.<collectionName>.drop();
40

41 db.teachers.drop();
42 db.students.drop();

159
Informationssysteme

20. MongoDB - DQL 20.1. Daten lesen 


Zum Abfragen von Daten definiert die MongoDB Spe-
zifikation den find Befehl.

L | 
20.1.1 find Befehl

Abfragen werden für die Datenbankengine in Form


von BSON Objekten formuliert. Das Ergebnis einer
Abfrage ist ein Cursor.

Abfragen können jedoch nur für die Dokumente


einer einzelnen Collection formuliert werden. Das
Konzept eines Joins über mehrere Collections wird
nicht unterstützt.

 Codebeispiel: find Befehl 


1 //-----------------------------------------
2 // Syntax: find
01. Daten lesen 160 3 //-----------------------------------------
4 var crsr = db.<collection>.find(
02. Kursormethoden 161 5 <query criteria>,
6 <projection>
03. Query Kriterien 164 7 );
8

9 //-----------------------------------------
04. Arrayoperatoren 166
10 // Beispiel: find
11 //-----------------------------------------
05. Projektion 167
12 var crsr = db.inventory.find( {
13 status: "A",
14 $or: [
15 { qty: { $lt: 30 } },
16 { item: "p" }
17 ]
18 } );
19

20 while (crsr.hasNext()){
21 printjson( crsr.next() );
22 }

 Erklärung: Methoden Parameter 


‚ query criteria: Eine Abfrage selbst wird in Form
eines BSON Objekts formuliert.

‚ projection: Mit einer Projektion können die Erge-


nisdokumente auf eine Untermenge ihrer Attribute
beschränkt werden.

‚ Cursor: Das Ergebnis einer Abfrage ist ein Cursor.

160
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 46. find Befehl

20.2. Kursormethoden  20.2.2 pretty() Methode

Die Darstellung von JSON Objekte ist in der Shell ab


< ResultSet  einer gewissen Komplexität schlecht lesbar.

Das Ergebnis einer Abfrage wird als Resultset Die pretty() Methode optimiert die Darstellung
bezeichnet. Im Falle einer MongoDB Daten- von Objekten für die Ausgabe in der Konsole.
bank ist das eine Sammlung von Dokumen-
ten.  Codebeispiel: pretty Methode 
1 //-----------------------------------------
3 Cursor  2 // Cursormethode: pretty
3 //-----------------------------------------
Ein Cursor ist eine Referenz auf die Element ei- 4 db.students.remove();
nes Resultsets. 5

6 db.students.insertOne( {
Das Ergebnis der find() Methode ist stets ein Cur- 7 _id : ObjectId(2),
sor. 8 firstName : "Franz",
9 lastName : "Xaver",
20.2.1 Cursormethoden 10 roles : ["student" , "room manager" ]
11 } );
Zur Verarbeitung eines Resultsets stellt die MongoDB 12

Spezifkation eine Reihe von Methoden zur Verfügung. 13 var crsr = db.students.find();
14 crsr.pretty();
 Codebeispiel: Cursormethoden  15

1 //----------------------------------------- 16 while ( crsr.hasNext() ){


2 // Beispiel: find 17 printjson(crsr.next());
3 //----------------------------------------- 18 }
4 var crsr = db.inventory.find( { 19

5 status: "A", 20 //-----------------------------------------


6 $or: [ 21 // Ausgabe
7 { qty: { $lt: 30 } }, 22 //-----------------------------------------
8 { item: "p" } 23 {
9 ] 24 _id : ObjectId(2),
10 } ); 25 firstName : "Franz",
11 26 lastName : "Xaver",
12 crsr = crsr.sort({ item : -1 }); 27 roles : [
13 28 "student",
14 while (crsr.hasNext()){ 29 "room manager"
15 printjson( crsr.next() ); 30 ]
16 } 31 }

q q

161
Informationssysteme

20.2.3 sort() Methode 20.2.4 limit() Methode

Durch den Aufruf der sort() Methode, werden die Do- Durch die Verwendung der limit() Methode wird das
kumente eines Resultsets einer Sortierung unterzogen. Resultsets auf seine ersten n Elemente beschränkt.

 Erklärung: sort Methode  Ein Limit von 0 zeigt alle Datensätze an. Für nega-
tive Werte wird der Betrag berechnet.
‚ Als Parameter erwartet die Methode ein Objekt, de-
ren Attributen die Felder definieren, nach denen sor-
 Codebeispiel: limit Methode 
tiert werden soll.
1 //-----------------------------------------
‚ Der Wert des Attributes definiert dabei das Sortier- 2 // Cursormethode: pretty
verhalten an: (1 = aufsteigend, -1 = absteigend). 3 //-----------------------------------------
‚ Idealerweise sollte nach Feldern sortiert werden, für 4 db.points.remove();
5
die ein Index generiert wurde.
6 db.points.insertMany(
7 { x : 0, y : 1, z : 4 },
 Codebeispiel: sort Methode 
8 { x : 0, y : 2, z : 4 },
1 //----------------------------------------- 9 { x : 0, y : 3, z : 4 }
2 // Cursormethode: pretty 10 );
3 //----------------------------------------- 11
4 db.points.remove(); 12 var crsr = db.points.find();
5
13 crsr.limit(2);
6 db.points.insertMany( 14
7 { x : 0, y : 2, z : 4 }, 15 //-----------------------------------------
8 { x : 0, y : 3, z : 4 }, 16 // Ausgabe
9 { x : 1, y : 4, z : 4 }, 17 //-----------------------------------------
10 { x : 1, y : 5, z : 5 }, 18 { x : 0, y : 1, z : 4 },
11 { x : 1, y : 6, z : 5 }, 19 { x : 0, y : 2, z : 4 }
12 { x : 2, y : 6, z : 5 }
13 );
q
14

15 var crsr = db.points.find();


16
20.2.5 batchSize(), objsLeftInBatch() Methode
17 crsr.sort( {
18 x : -1, Die Batchsize definiert die maximale Zahl an Elemen-
19 y : -1 ten, die in einem Resultset enthalten sein können.
20 } );
21
Mit der batchSize() Methode wird die gegenwärti-
22 while ( crsr.hasNext() ){ ge Batchsize der Datenbankengine konfiguriert.
23 printjson(crsr);
24 }  Codebeispiel: batchSize Methode 
25 1 //-----------------------------------------
26 //----------------------------------------- 2 // Cursormethode: pretty
27 // Ausgabe 3 //-----------------------------------------
28 //----------------------------------------- 4 var crsr = db.points.find({}, {_id:0});
29 { x : 2, y : 6, z : 5 } 5 crsr.batchSize(100);
30 { x : 1, y : 6, z : 5 } 6

31 { x : 1, y : 5, z : 5 } 7 while( crsr.hasNext() ) {
32 { x : 1, y : 4, z : 4 } 8 printjson(crsr.next());
33 { x : 0, y : 3, z : 4 } 9 print(crsr.objsLeftInBatch());
34 { x : 0, y : 2, z : 4 } 10 }

q q

162
© Dipl.Ing.-Paul Panhofer Bsc.

Methode Beschreibung

cursor.forEach() Applies a JavaScript function for every document in a cursor.

cursor.map() Applies a function to each document in a cursor and collects the return values in an array.

cursor.skip() Returns a cursor that begins returning results only after passing or skipping a number of
documents.

cursor.limit() Constrains the size of a cursor’s result set.

cursor.size() Returns a count of the documents in the cursor after applying skip() and limit() methods.

cursor.count() Modifies the cursor to return the number of documents in the result set rather than the documents
themselves.

cursor.sort() Returns results ordered according to a sort specification.

cursor.hasNext() Returns true if the cursor has documents and can be iterated.

cursor.next() Returns the next document in a cursor.

cursor.batchSize() Controls the number of documents MongoDB will return to the client in a single network message.

cursor.close() Close a cursor and free associated server resources.

cursor.isClosed() Returns true if the cursor is closed.

Abbildung 47. Kursormethoden

20.2.6 forEach() Methode 20.2.7 skip() Methode

Zur weiteren Verarbeitung der Elemente eines Re- Mit der skip() Methode kann der Cursor eines Result-
sultsets definiert die MongoDB Spezifikation die sets verändert werden.
forEach() Methode.
 Codebeispiel: skip Methode 
 Codebeispiel: forEach Methode  1 //-----------------------------------------
1 //----------------------------------------- 2 // Cursormethode: skip
2 // Cursormethode: forEach 3 //-----------------------------------------
3 //----------------------------------------- 4 var crsr = db.inventory.find( {
4 db.persons.find({}).forEach(function(doc){ 5 status: "A",
5 db.persons.updateOne( 6 qty: { $lt: 30 },
6 {_id : doc._id}, 7 item: "p"
7 {$set : { 8 } );
8 email : doc.lastName; 9

9 }}); 10 crsr = crsr.skip(100);


10 }); 11 crsr.limit(20);

q q

163
Informationssysteme

20.3. Query Kriterien - Abfrageobjekt  20.3.2 Formen von Bedingungen

Als Bedingung wird eine mathematische Aussage be-


Zum Abfragen von Daten definiert die MongoDB Spe-
zeichnet die entweder wahr oder falsch sein kann.
zifikation den find() Befehl. Abfragen selbst werden
dabei in Form eines BSON Dokuments formuliert.
 Auflistung: Formen von Bedingungen 
1 //-----------------------------------------
20.3.1 Abfrageobjekt 2 // Syntax: Bedingung
3 //-----------------------------------------
Ein Abfrageobjekt definiert welche Eigenschaften
4 { <field> : { $operator : <value> }}
bzw. Struktur ein Dokument haben muß, um in die Er-
5
gebnismenge einer Abfrage aufgenommen zu werden.
6 {title : {$eq : "Planungssysteme"}}
Abfragen dieser Art werden als Query by Example 7 {type : {$ne : "FUNDING_PROJECT"}}
bezeichnet. 8 {isFFGSponsored : {$eq : true }}
9
 Erklärung: Abfrageobjekt  10 //-----------------------------------------
‚ Ein Abfrageobjekt hat dabei stets die selbe Struk- 11 // $eq - equal, $ne - not equal
tur. 12 //-----------------------------------------
13 db.projects.find({
‚ Ein Abfrageobjekt definiert eine Logische Verknüp-
14 $nor : [
fung von Bedingungen. Die Logische Verknüpfung
15 {type : {$eq : "MANAGEMENT_PROJECT"}},
erfolgt dabei über einen der logischen Operatoren
16 {type : {$eq : "RESEARCH_PROJECT"}},
$and, $or bzw. $nor.
17 {type : {$eq : "FUNDING_PROJECT"}},
 Syntax: Abfrageobjekt  18 {tpye . {$eq : "STIPENDIUM"}}
19 ]
1 //-----------------------------------------
20 });
2 // Syntax: Abfrageobjekt
21
3 //-----------------------------------------
22 db.projects.find({
4 db.projects.find({
23 $or : [
5 $and : [
24 {isFFGSponsored : {$ne : false}},
6 {title : {$eq : "Planungssysteme"}},
25 {isFWFSponsored : {$ne : false}},
7 {type : {$eq : "FUNDING_PROJECT"}},
26 {isEUSponsored : {$ne : false}}
8 {state : {$eq : "IN_PROGRESS"}},
27 ]
9 {isFWFSponsored : {$eq : true}}
28 });
10 ]
29
11 });
30 // Einzelne Bedingung
12
31 db.projects.find({
13 db.<collection>.find({
32 { type : { $eq : "RESEARCH_PROJECT"} }
14 $logischerOperator : [
33 });
15 { .. mathematische Bedingung .. },
34
16 { .. mathematische Bedingung .. },
35 //-----------------------------------------
17 { .. mathematische Bedingung .. },
36 // $lt, $lte - less than, less than equal
18 { .. mathematische Bedingung .. },
37 // $gt, $gte - greater than
19 { .. mathematische Bedingung .. },
38 //-----------------------------------------
20 { .. mathematische Bedingung .. },
39 db.projects.find({
21 { .. mathematische Bedingung .. },
40 $and : [
22 { .. mathematische Bedingung .. },
41 {review : {$gte : 3}},
23 ...
42 {review : {$lte : 5}}
24 ]
43 ]
25 });
44 });

q
q

164
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 48. Abfrageobjekt

20.3.3 Kurzformen von Abfragen 20.3.4 Komplexe Bedingungen

Für bestimmte Abfrageformen stellt die MongoDB Zur Formulierung komplexer Abfragen erlaubt die
Spezifikation eine vereinfachte Form zur Verfügung. MongoDB Spezifkation das Schachteln logischer Aus-
drücke.
 Codebeispiel: Kurzformen 
 Codebeispiel: Komplexe Bedingungen 
1 //-----------------------------------------
1 //-----------------------------------------
2 // Fallbeispiel: Kurzformen
2 // Fallbeispiel: komplexe Bedingungen
3 //-----------------------------------------
3 //-----------------------------------------
4 // Kurzform: $eq Operator
4 db.projects.find({
5 db.projects.find({
5 $or : [
6 {type : {$eq : "REQUEST_FUNDING_PROJECT"}}
6 {
7 });
7 $and : [
8 /* ==> */
8 {type : {$eq : "FUNDING_PROJECT"}},
9 db.projects.find({
9 {isFFGSponsored : {$eq : true}}
10 {type : "REQUEST_FUNDING_PROJECT"}
10 ]
11 });
11 }, {
12
12 $and : [
13 // Kurzform: $and Operator
13 {type : {$eq : "REQUEST_PROJECT"}},
14 db.projects.find({
14 {isFWFSponsored : {$eq : true}}
15 $and : [
15 ]
16 {isFWFSponsored : true},
16 }
17 {isFFGSponsored : true}
17 ]
18 ]
18 });
19 });
19
20 /* ==> */
20 // ----------------------------------------
21 db.projects.find({
21 // Komplexe Bedingungen : embedded Object
22 {isFWFSponsored : true},
22 // ----------------------------------------
23 {isFFGSponsored : true}
23 db.subprojects.find(
24 });
24 $and : [
25
25 {theoreticalResearch : {$gte : 30}},
26 // Kurzform: Abfragebedingungen
26 {
27 db.projects.find({
27 "facility.code" : "124.339.125"
28 {review : {$gt:3}}, {review : {$lt:10}}
28 },{
29 });
29 isEUSponsored : true
30 /* ==> */
30 }
31 db.projects.find(
31 ]
32 {review : {$gt : 3, $lt : 10}}
32 );
33 );

q
q

165
Informationssysteme

20.3.5 $in Operator 20.4. Arrayabfragen 


Mit dem $in Operator kann geprüft werden, ob ein
Für Abfragen auf Arraydaten definiert die MongoDB
bestimmter Wert in einer Liste von Werten enthalten
Spezifikation eigene Operatoren.
ist.
 Codebeispiel: $in Operator 
20.4.1 $size Operator
1 //-----------------------------------------
2 // $in Operator Der $size Operator prüft die Anzahl der Werte in ei-
3 //----------------------------------------- nem Array.
4 db.inventory.find( {
5 status : { Der $size Operator erlaubt dabei lediglich Äequiva-
6 $in [ lenzprüfungen.
7 "IN_PROGRESS", "CANCELED",
 Codebeispiel: $size Operator 
8 "APPROVED", "FINISHED"
1 //-----------------------------------------
9 ]
2 // $size Operator
10 }
3 //-----------------------------------------
11 } );
4 db.projects.find({
5 $and : [
q 6 { reviews : { $size : 3 } }
7 ]
20.3.6 $where Operator 8 });

Komplexe Abfragen können auch in Form einer JavaS-


q
cript Funktion formuliert werden.

 Erklärung: $where Operator 


‚ Der $where Operator speichert dazu die Bedingung
in Form einer JavaScript Funktion ab.
‚ Der this Operator dient in diesem Kontext als Re-
ferenz auf das eigentliche Dokument.

 Codebeispiel: $where Operator 


1 //-----------------------------------------
2 // $where Operator
3 //-----------------------------------------
4 db.inventory.find() { 20.4.2 $all Operator
5 $where : function(){
Der $all Operator prüft ob eine Liste von Werten in
6 var flag = true
einem Array enthalten ist.
7

8 if(this.isSmallProject ||
 Codebeispiel: $all Operator 
this.isEuSponsored)
9 flag = false; 1 //-----------------------------------------
10
2 // $all Operator
11 if(this.fundings.length < 2) 3 //-----------------------------------------
12 flag = flase; 4 db.projects.find({
13
5 reviews : { $all : [3,6,4] }
14 return flag; 6 });
7
15 }
16 } ); 8 db.projects.find({ reviews : 5 });

q q

166
© Dipl.Ing.-Paul Panhofer Bsc.

Arrayoperator Beschreibung

$all Der $all Operator prüft ob eine Liste von Werten in einem Array enthalten ist.

$size Der $size Operator prüft die Anzahl der Werte in einem Array.

$elemMatch Für die Prüfung von Objekten in Arrays wird der $elemMatch Operator verwendet. Ist im Array
ein Objekt gespeichert, das die formulierten Bedingungen erfüllt, wird das Dokument in die
Ergebnismenge aufgenommen.

Abbildung 49. Arrayoperatoren

20.4.3 $elemMatch Operator 20.5. Projektion 


Zur Prüfung der Eigenschften von Objekten in Arrays
Sind für eine Abfrage nicht alle Attribute eines Doku-
wird der $elemMatch Operator verwendet.
ments interessant, wird durch die Angabe einer Pro-
jektion eine entsprechende Einschränkung definiert.
Beinhaltet das Array ein Element, das alle Bedin-
gungen erfüllt wird das Dokument in die Ergebnis-
menge aufgenommen. 20.5.1 Projektionsobjekt

Projektionen werden durch die Angabe eines Projek-


 Codebeispiel: $elemMatch Operator 
tionsobjekts definiert.
1 //-----------------------------------------
2 // Abfrageoperatoren: $elemMatch  Erklärung: Projektionsobjekt 
3 //-----------------------------------------
‚ Die Attribute des Projektionsobjekts definieren die
4 // Der $elemMatch Operator erwartet ein
Felder der Projektion. Attributen, die in das Ergeb-
5 // Abfrageobjekt
nis aufgenommen werden sollen, wird 1 als Wert zu-
6 db.projects.find({
geordnet.
7 fundings : {
8 $elemMatch : { ‚ Das _id Attribut eines Dokuments ist defaultmäßig
9 $and : [ Teil der Projektion.
10 {debitorName : "TU Wien"},
 Codebeispiel: Projektion 
11 {amount : NumberLong(1500)}
1 //-----------------------------------------
12 ]
2 // Beispiel: find
13 }
3 //-----------------------------------------
14 }
4 var crsr = db.inventory.find(
15 });
5 { status: "A",
16
6 $or: [
17 db.projects.find({
7 { qty: { $lt: 30 } },
18 projectStaff : {
8 { item: p }
19 $elemMatch : {
9 ]
20 $and : [
10 },
21 {role : {$in : ["MANAGER"]}},
11 { _id : 0 , status : 1, item : 1}
22 {lastName : "Gruber"}
12 );
23 ]
13
24 }
14 while (crsr.hasNext()){
25 }
15 printjson( crsr.next() );
26 });
16 }

q
q

167
Informationssysteme

21. MongoDB - DML 21.1. Daten einfügen - insert 


Für das Einfügen von Daten stellt die MongoDB Spe-
zifikation mehrere Formen des insert() Befehls zur
Verfügung.

21.1.1 Nebeneffekte

Beim Einfügen von Dokumenten in eine Collection


treten in der Regel mehrere Nebeneffekte auf.

 Erklärung: Nebeneffekte des Insert Befehls 


‚ collection: Wird die insert() Methode auf einer
nicht existierende Collection aufgerufen, legt die Da-
tenbankengine die Collection implizit an.

‚ ObjectID: Für Dokumente ohne ein _id Attribut,


generiert die Datenbankengine eine eindeutige ID
beim Einfügen des Dokuments.

01. Daten einfügen 168


21.1.2 insertOne(), insertMany() Befehl
02. Daten bearbeiten 169
 Codebeispiel: insertOne() Befehl 
03. Strukturoperatoren 171 1 //-----------------------------------------
2 // Syntax: insertOne
04. Werteoperatoren 173 3 //-----------------------------------------
4 db.<collection>.insertOne(<document>);
05. Arrayoperatoren 174 5

6 //-----------------------------------------
03. Daten löschen 177 7 // insertOne: document without _id
8 //-----------------------------------------
9 try {
10 db.products.insertOne(
11 {item:"card", qty:15}
12 );
13 } catch (e) {
14 print (e);
15 };
16

17 // insertOne: document with _id


18 try {
19 db.products.insertOne( {
20 _id : 10, item : "box"
21 } );
22 } catch (e) {
23 print (e);
24 }

168
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 50. insert document

 Codebeispiel: insertMany() Befehl  21.2. Daten bearbeiten - update 


1 //-----------------------------------------
2 // Syntax: insertMany Zum Bearbeiten von Dokumenten definiert die Mon-
3 //----------------------------------------- goDB Spezifikation mehrere Formen des update() Be-
4 db.<collection>.insertMany([<document>, ...]); fehls.
5

6 //----------------------------------------- 21.2.1 updateOne() Befehl


7 // insertMany: document without _id
8 //----------------------------------------- Für das Bearbeiten eines einzelnen Dokuments, stellt
9 try { die MongoDB Spezifikation den updateOne() Befehl
10 db.products.insertMany( [ zur Verfügung.
11 { item: "card", qty: 15 },
 Codebeispiel: updateOne() Befehl 
12 { item: "envelope", qty: 20 }
1 //-----------------------------------------
13 ] );
2 // Syntax: updateOne
14 } catch (e) {
3 //-----------------------------------------
15 print (e);
4 db.<collection>.updateOne(
16 }
5 <query criteria>, <update operator>
17
6 );
18 var returnValue = {
7
19 "insertedIds" : [
8 try {
20 ObjectId("562a94d381cb9f1cd6eb0e1a"),
9 db.products.updateOne(
21 ObjectId("562a94d381cb9f1cd6eb0e1b")
10 { "_id" : 1 },
22 ]
11 { $set: { "sold" : true } }
23 };
12 );
24
13 } catch (e) {
25 //-----------------------------------------
14 print(e);
26 // insertMany: document with _id
15 }
27 //-----------------------------------------
28 try {
 Erklärung: updateOne Parameter 
29 db.products.insertMany( [
30 { _id: 10, item: "large", qty: 20 }, ‚ query criteria: Mit dem Parameter wird definiert,
31 { _id: 11, item: "small", qty: 55 } welche Dokumente einer Collection einer Änderung
32 ] ); unterzogen werden sollen. Der Parameter erwartet
33 } catch (e) { dazu eine Abfrageobjekt.
34 print (e); ‚ update operator: Der Parameter definiert die Art
35 } der Änderung. Die MongoDB Spezifikation definiert
dazu 14 unterschiedliche Operatoren.
q
q

169
Informationssysteme

Operator Beschreibung

$set Mit dem $set Operator werden ein oder mehrere Felder auf einen konstanten, neuen Wert gesetzt.
Felder, die noch nicht existieren, werden angelegt.

$unset Zum Löschen von Feldern wird der $unset Operator verwendet. Die Namen der zu löschenden Felder
werden als Schlüssel mit Wert 1 angegeben.

$rename Eine Umbennenung eines oder mehrerer Feder wird mit dem $rename Operator durchgeführt. Der
Schlüssel des jeweiligen Feldes im Änderungsdokument ist der Name des umzubenennenden Feldes,
der Wert der neue Name.

$inc Mithilfe des $inc Operators lassen sich numerische Felder um einen bestimmten, festen Betrag erhö-
hen bzw. erniedrigen (bei negativen Werten). Werden Felder angageben, die es zuvor nicht gab,
werden diese auf den entsprechenden Wert gesetzt.

$mul Der $mul Operator multipliziert ein numerisches Feld mit dem angegebenen Faktor.

$currentDate Der $currentDate Operator wird verwendet um Datumsfelder zu setzen.

$max Only updates the field if the specified value is greater than the existing field value.

$min Only updates the field if the specified value is greater than the existing field value.

$setOrInsert Sets the value of a field if an update results in an insert of a document. Has no effect on update
operations that modify existing documents.

$push Der $push Operator hängt an ein Array, ein weiteres Element an falls das Feld noch nicht existiert,
wird es angelegt.

$addToSet Analog zu $push fügt $addToSet einem Array einen oder mehrere Werte hinzu, allerdings nur dann,
wenn der jeweilige Wert noch nicht in dem Array enthalten ist.

$pop Der $pop Operator ist das Gegenstück zum $push bzw. $addToSett Operator. Mit ihm wird das letzte
bzw. erste Element eines Array gelöscht. Zum Löschen des letzten Elements ist eine 1 zu übergeben,
-1 löscht hingegen das erste Element.

$pull Removes all array elements that match a specified query.

$pullAll Der $pullAll Operator hängt an ein Array, ein weitere Elemente an falls das Feld noch nicht existiert,
wird es angelegt.

$each Modifies the $push and $addToSet operators to append multiple items for array updates.

$position Modifies the $push operator to specify the position in the array to add elements.

$slice Modifies the $push operator to limit the size of updated arrays.

$sort Modifies the $push operator to reorder documents stored in an array.

Abbildung 51. update Operatoren

. .

170
© Dipl.Ing.-Paul Panhofer Bsc.

21.2.2 updateMany Befehl 21.3. Strukturoperatoren 


Die updateMany Methode initialisiert eine Änderung Mit Strukturoperatoren kann die Struktur von Doku-
mehrerer Dokumente. menten geändert werden.

 Codebeispiel: updateMany 
21.3.1 $set Operator
1 //-----------------------------------------
2 // Syntax: updateMany Der $set Operator wird verwendet um den Wert eines
3 //----------------------------------------- Attributes zu ändern.
4 db.<collection>.updateMany(  Erklärung: $set Operator 
5 <query criteria>,
6 <update>,
‚ Mit dem $set Operator werden ein oder mehrere
Attribute auf einen neuen, konstanten Wert gesetzt.
7 );
8 ‚ Existiert eines der angegebenen Felder nicht, wird
9 try { es zusammen mit dem neuen Wert im Dokument
10 db.restaurant.updateMany( angelegt.
11 { violations: { $gt: 4 } },
12 { $set: { "review" : true } }  Codebeispiel: $set Operator 
13 ); 1 //-----------------------------------------
14 } catch (e) { 2 // update Operator: $set
15 print(e); 3 //-----------------------------------------
16 } 4 db.products.insertMany([{
5 _id : 100,
6 rating : 4,
 Codebeispiel: updateMany 
7 tags : [ "apparel", "clothing" ]
1 //----------------------------------------- 8 }, {
2 // Beispiel: updateMany 9 _id : 101,
3 //----------------------------------------- 10 rating : 6,
4 var restaurant2 = { 11 tags : [ "apparel", "clothing" ]
5 _id : 2, 12 }
6 name : "Rock A Feller Bar", 13 ]);
7 violations : 2 14
8 }; 15 db.products.updateOne(
9
16 { _id: 100 },
10 var restaurant3 = { 17 { $set : {
11 _id : 3, 18 quantity: 500,
12 name : "Empire State Sub", 19 tags: [
13 violations : 5 20 "coats", "outerwear", "clothing"
14 }; 21 ]
15
22 }
16 db.restaurant.updateMany( 23 }
17 { violations: { $gt: 4 } }, 24 );
18 { $set: { "review" : true } } 25
19 ); 26 var product = {
20
27 _id : 100,
21 var restaurant3 = { 28 quantity : 500,
22 _id : 3, 29 rating : 4,
23 name : "Empire State Sub", 30 tags : [
24 violations : 5, 31 "coats", "outerwear", "clothing"
25 review : true 32 ]
26 }; 33 }

q q

171
Informationssysteme

21.3.2 $unset Operator 21.3.3 $rename Operator

L $unset Operator  L $rename Operator 


Der $unset Operator wird zum Löschen von At- Der $rename Operator wird zum Umbennen
tributen verwendet. von Attributen in Dokumenten verwendet.

 Erklärung: $unset Operator   Erklärung: $rename Operator 


‚ Zu löschende Felder werden als Attribute des Upda- ‚ Das Renameobjekt enthält dazu den neuen und
teobjekts definiert. alten Namen des Attributes in Form eines Schlüs-
sel/Wertepaars.
‚ Attribute die nicht im Zieldokument definiert sind,
werden ignoriert.  Codebeispiel: $rename Operator 
1 //-----------------------------------------
 Codebeispiel: $unset Operator  2 // update Operator: $rename
1 //----------------------------------------- 3 //-----------------------------------------
2 // update Operator: $unset 4 db.students.insertMany([
3 //----------------------------------------- 5 {
4 var product = { 6 alias : [ "The American Cincinnatus" ],
5 _id : 100, 7 nmae : {
6 sku : "abc123", 8 first : "george", last : "was"
7 quantity : 250, 9 }, {
8 reorder : false, 10 alias : [ "My dearest friend" ],
9 details : { 11 nmae : {
10 model: "14Q2", make: "xyz" 12 first : "abigail", last : "adams"
11 }, 13 }
12 tags : [ "apparel", "clothing" ], 14 ]);
13 ratings : [ 15

14 { by: "ijk", rating: 4 } 16 db.student.updateMany{


15 ] 17 {},
16 }; 18 {$rename : {nmae : "name"}}
17 19 };
18 db.products.updateOne( 20

19 { _id: 100 }, 21 > Ausgabe


20 { $unset: { 22

21 ratings : "", 23 {
22 reorder : "" 24 alias : [ "The American Cincinnatus" ],
23 } } 25 name : {
24 ); 26 first : "george",
25 27 last : "was"
26 var product = { 28 }
27 _id : 100, 29 }
28 sku : "abc123", 30 {
29 quantity : 500, 31 alias : [ "My dearest friend" ],
30 details : { 32 name : {
31 model: "14Q2", make: "xyz" 33 first : "abigail",
32 }, 34 last : "adams"
33 tags : [ "apparel", "clothing" ] 35 }
34 } 36 }

q q

172
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 52. update Operatoren

21.4. Werteoperatoren  21.4.2 $min Operator

Werteoperatoren werden zum Bearbeiten numeri- Mit dem $min Operator wird der Wert eines Feldes
scher Werte verwendet. auf den kleineren 2er Werte gesetzt.

 Codebeispiel: $min Operator 


21.4.1 $mul Operator
1 //-----------------------------------------
Der $mul Operator wird verwendet um ein Feld auf 2 // update Operator: $min
ein Vielfaches seines ursprünglichen Wertes zu setzten. 3 //-----------------------------------------
4 var result = {
 Codebeispiel: $mul Operator  5 _id: 1,
1 //----------------------------------------- 6 highScore: 800,
2 // update Operator: $mul 7 lowScore: 200
3 //----------------------------------------- 8 };
9
4 var product1 = {
5 _id : 1, 10 var result = {
6 price : NumberDecimal("10.99"), 11 _id: 2,
7 qty : 25 12 highScore: 1800,
8 }; 13 lowScore: 50
9
14 };
15
10 db.products.updateOne(
11 { _id: 1 }, 16 db.scores.updateOne(
12 { 17 { _id: 1 },
13 $mul: { 18 { $min: { lowScore: 250 }}
14 price: NumberDecimal("1.25"), 19 );
20
15 qty : 2
21
16 }
17 } 22 //-----------------------------------------
18 ); 23 // Ergebnis: $min
19
24 //-----------------------------------------
20 var updatedProduct = { 25 var updatedResult = {
21 _id : 1, 26 _id: 1,
22 price : NumberDecimal("14.7375"), 27 highScore : 800,
23 qty : 50 28 lowScore : 200
24 }; 29 };

q q

173
Informationssysteme

21.4.3 $inc Operator 21.5. Arrayoperatoren 

L $inc Operator  Mit Arrayoperatoren können Arrays in Dokumen-


ten bearbeitet werden.
Der $inc Operator wird verwendet um nume-
rische Werte zu bearbeiten.
21.5.1 $addToSet Operator
 Erklärung: $inc Operator  Der $addToSet Operator wird verwendet um zu einem
‚ Mithilfe des $inc Operators werden numerische Array einen oder mehrere Werte hinzuzufügen.
Felder um einen bestimmten, festen Betrag erhöht
bzw. erniedrigt.  Erklärung: $addToSet Operator 
‚ Existiert das angegebene Attribute nicht, wird es in ‚ Die Werte werden jedoch nur dann zum Array hin-
das Dokument eingefügt. zugefügt, wenn sie im Array noch nicht enthalten
waren.
 Codebeispiel: $inc Operator 
‚ Zum Hinzufügen mehrerer Werte muß der
1 //-----------------------------------------
$addToSet Operator mit dem $each Operator
2 // update Operator: $inc
kombiniert werden.
3 //-----------------------------------------
4 var cart = {
5 _id : 1,  Codebeispiel: $addToSet Operator 
6 sku : "abc123", 1 //-----------------------------------------
7 default : "tower", 2 // update array Operator: $addToSet
8 quantity : 10, 3 //-----------------------------------------
9 type : "showel", 4 var test = {
10 metrics : { 5 _id: 1, letters: ["a", "b"]
11 orders: 2, 6 };
12 ratings: 3.5 7

13 } 8 db.test.updateOne(
14 }; 9 { _id: 1 },
15 10 { $addToSet: { letters: [ "c", "d" ] } }
16 db.products.updateMany( 11 );
17 { sku: "abc123" }, 12

18 { $inc: { 13 var updatedTest = {


19 quantity: -2, 14 _id: 1,
20 "metrics.orders": 1 15 letters: [ "a", "b", [ "c", "d" ] ]
21 } 16 };
22 } 17

23 ); 18 var test = { _id: 2, letters: ["a", "b"] };


24 19

25 var updatedCart = { 20 db.test.updateOne(


26 _id : 1, 21 { _id: 2 },
27 sku : "abc123", 22 { $addToSet: {
28 default : "tower", 23 letters: { $each : [ "c", "d" ] }
29 type : "showel", 24 }
30 quantity : 8, 25 }
31 metrics : { 26 );
32 orders : 3, 27

33 ratings : 3.5 28 var updatedTest = {


34 } 29 _id: 2, letters: [ "a", "b", "c", "d" ]
35 }; 30 };

q q

174
© Dipl.Ing.-Paul Panhofer Bsc.

21.5.2 $push Operator Der push Operator definiert eine Reihe von Modi-
fikatoren um sein Verhalten zu adaptieren.

L $push Operator   Erklärung: $slice, $sort $position Modifier 


Der $push Operator wird verwendet um Ele- ‚ $position Modifier: Der $position Modifier defi-
mente zu einem Array hinzuzufügen. Die hin- niert an welcher Position im Array die Daten einge-
zuzufügenden Werte unterliegen jedoch kei- fügt werden sollen.
ner Prüfung auf Eindeutigkeit. ‚ $slice Modifier: Der $slice Modifier limitiert das
Array auf die ersten bzw. letzten n Elemente.
 Erklärung: $push Operator  ‚ $sort Modifier: Der $sort Modifier wird verwendet
‚ Der $push Operator fügt ein Element in ein Array um die Elemente eines Arrays zu sortieren.
ein. Falls das Array nicht existiert, wird es angelegt.
 Codebeispiel: $slice, $sort $position 
 Codebeispiel: $push Operator  1 //-----------------------------------------
2 // update array Operator: $push
1 //-----------------------------------------
3 //-----------------------------------------
2 // update array Operator: $push
4 var student = {
3 //-----------------------------------------
5 _id : 5,
4 var student = {
6 quizzes : [
5 _id : 5,
7 { wk : 1, score : 10 },
6 quizzes : [
8 { wk : 2, score : 8 },
7 { wk : 1, score : 10 },
9 { wk : 3, score : 5 },
8 { wk : 2, score : 8 }
10 { wk : 4, score : 6 }
9 ]
11 ]
10 };
12 };
11
13
12 db.students.updateOne(
14 db.students.updateOne(
13 { _id: 5 },
15 { _id: 5 },
14 { $push: {
16 { $push: {
15 quizzes: {
17 quizzes: {
16 $each: [
18 $each: [
17 { wk: 5, score: 8 },
19 { wk: 5, score: 8 },
18 { wk: 6, score: 7 },
20 { wk: 6, score: 7 },
19 { wk: 7, score: 6 }
21 { wk: 7, score: 6 }
20 ],
22 ],
21 $sort: { score: -1 }
23 $slice : 4
22 }
24 }
23 }
25 }
24 }
26 }
25 );
27 );
26
28
27 var updatedStudent = {
29 var updatedStudent = {
28 _id : 5,
30 _id : 5,
29 quizzes : [
31 quizzes : [
30 { wk : 1, score : 10 },
32 { wk : 1, score : 10 },
31 { wk : 2, score : 8 },
33 { wk : 2, score : 8 },
32 { wk : 5, score : 8 },
34 { wk : 3, score : 5 },
33 { wk : 6, score : 7 },
35 { wk : 4, score : 6 }
34 { wk : 7, score : 6 }
36 ]
35 ]
37 }
36 }

175
Informationssysteme

21.5.3 $pull, $pullAll Operator 21.5.4 $pop Operator

 Erklärung: $pull Operator 


L $pop Operator 
‚ Mit dem $pull bzw. $pullAll Operator lassen sich
gezielt Werte aus einem Array entfernen. Der $pop Operator wird verwendet um Ele-
mente aus einem Array zu löschen.
‚ $pull löscht alle Vorkommen eines einzelnen Wertes.
$pullAll löscht alle Vorkommen mehrerer Werte.
 Erklärung: $pop Operator 
 Erklärung: $pull Operator  ‚ Der $pop Operator ist das Gegenstück zum $push
1 //----------------------------------------- bzw. $addToSet Operator.
2 // update array Operator: $pull ‚ Der $pop Operator löscht das letzte bzw. erste Ele-
3 //----------------------------------------- ment eines Arrays.
4 var store = { _id: 1,
5 fruits: [ "apples", "oranges", "grapes" ], ‚ Zum Löschen des letzten Elements wird 1, des ersten
6 vegetables: [ Elements -1 übergeben.
7 "carrots", "celery", "carrots"
8 ]  Codebeispiel: $pop Operator 
9 }; 1 //-----------------------------------------
10 2 // update array Operator: $pop
11 var store2 = { _id: 2, 3 //-----------------------------------------
12 fruits: [ "oranges", "bananas", "apples" ], 4 var student = {
13 vegetables: [ 5 _id: 1,
14 "broccoli", "zucchini", "carrots" 6 scores: [ 8, 9, 10 ]
15 ] 7 };
16 } 8

17 9 db.students.updateOne(
18 db.stores.updateMany( 10 { _id: 1 },
19 { }, 11 { $pop: { scores: -1 } }
20 { $pull: { 12 );
21 fruits: { 13

22 $in: [ "apples", "oranges" ] 14 var updatedStudent = {


23 }, 15 _id: 1,
24 vegetables: "carrots" 16 scores: [ 9, 10 ]
25 } 17 };
26 }, 18

27 { multi: true } 19 //-----------------------------------------


28 ) 20 // update array Operator: $pop
29 21 //-----------------------------------------
30 var updatedStore = {_id: 1, 22 var student = { _id: 1, scores: [ 8, 9, 10 ]
31 fruits: [ "grapes" ], };
32 vegetables: [ 23

33 "celery", "carrots" 24 db.students.updateOne(


34 ] 25 { _id: 1 },
35 }; 26 { $pop: { scores: 1 } }
36 27 );
37 var updatedStore2 = { _id: 2, 28

38 fruits: [ "bananas" ], 29 var updatedStudent = {


39 vegetables: [ "broccoli", "zucchini" ] 30 _id: 1,
40 } 31 scores: [ 8, 9 ]
32 }
q
q

176
© Dipl.Ing.-Paul Panhofer Bsc.

21.6. Daten löschen  .

Befehle zum Löschen von Dokumenten aus Collecti-


ons.

L | 
21.6.1 delete Befehl

MongoDB unterscheidet mehrere Befehle zum Lö-


schen von Dokumenten.

 Codebeispiel: deleteOne, deleteMany Befehl 


1 //-----------------------------------------
2 // Syntax: deleteOne
3 //-----------------------------------------
4 db.<collection>.deleteOne(
5 <filter>,
6 );
7

8 //-----------------------------------------
9 // Syntax: deleteMany
10 //-----------------------------------------
11 db.<collection>.deleteMany(
12 <filter>,
13 );
14

15 //-----------------------------------------
16 // Beispiel: deleteOne, deleteMany
17 //-----------------------------------------
18 try {
19 db.orders.deleteOne( {
20 "_id" :
ObjectId("563237a41a4d68582c2509da")
21 } );
22 } catch (e) {
23 print(e);
24 }
25

26 try {
27 db.orders.deleteOne( {
28 "expiryts" : {
29 $lt: ISODate("2015-11-01T12:40:15Z")
30 }
31 } );
32 } catch (e) {
33 print(e);
34 }

177
Informationssysteme

22. MongoDB - Aggregation von Daten 22.1. Methoden und Verfahren 


Zum Schreiben komplexer Auswertungen definiert
die MongoDB Spezifikation mehrere Aggregationsalgo-
rithmen.

Aggregationsalgorithmen kommen immer dann zum


Einsatz, wenn Auswertungen über die Dokumente
mehrerer Collections hinweg, durchgeführt werden
müssen.

22.1.1 Aggregatalgorithmen

Zum Aggregieren von Daten stellt die MongoDB Spe-


zifikation 3 Frameworks zur Verfügung.

 Auflistung: Aggregationsalgorithmen 

) Abfragemethoden 
Abfragemethoden erlauben das Aggregie-
ren von Daten für die Dokumente einer Col-
01. Methoden und Verfahren 178 lection.

02. Abfragemethoden 179


( Aggregatframework 
03. Aggregationsframework 180 Das Aggregatframework erlaubt die Formulie-
rung komplexer Abfragen für die Dokumente
04. Dokumentstufen 184 mehrerer Collections.

05. Strukturstufen 186


 Map Reduce 
06. Beziehungsstufen 188 Der Map Reduce Algorithmus ist ein Verfahren
zur nebenläufigen Verarbeitung großer Daten-
07. Aggregatstufen 191 mengen.

08. Expressions 193


 Erklärung: Aggregatalgorithmen 
09. Arrayoperatoren 195 ‚ Abfragemethoden: Abfragemethoden erlauben le-
diglich das Aggregieren von Daten für die Doku-
10. Kontrolloperatoren 193 mente einer einzelnen Collection. Abfragemethoden
sind in ihrem Funktionsumfang damit relativ einge-
11. Aggregatoperatoren 198 schränkt.

‚ Aggregatframework: Das Aggregatframework er-


möglicht komplexe Auswertungen für Dokumente in
mehreren Collections.

‚ Map Reduce Verfahren: Der Map Reduce Algorith-


mus ist der flexibelste der 3 Aggregationsalgorith-
men. Das Verfahren weist bei einer Implementierung
jedoch eine hohe Komplexität auf.

178
© Dipl.Ing.-Paul Panhofer Bsc.

Abfragemethoden Beschreibung

count Mit der Hilfe der count Methode wird die Anzahl der Dokumente eines Resultsets ermittelt.

distinct Mit der distinct Methode können alle unterschiedliche Werte eines Attributes in Form eines
Array ermittelt werden.

group Die group() Methode gruppiert die Daten einer Collection anhand eines Schlüssels. Für die
gruppierten Daten können nun einfache Operationen wie das Zählen oder das Aufsummieren
von Werten durchgeführt werden.

Abbildung 53. Abfragemethoden

22.2. Abfragemethoden  22.2.2 Abfragemethode: distinct()

Mit der distinct() Methode können die unterschied-


Abfragemethoden erlauben das Aggregieren von Da-
lichen Ausprägungen eines Attributes für die Doku-
ten für die Dokumente einer Collection.
mente einer Collection bestimmt werden.

22.2.1 Abfragemethode: count()  Codebeispiel: distinct() Methode 

Mit Hilfe der count() Methode kann die Anzahl der 1 //-----------------------------------------
Dokumente eines Resultsets ermittelt werden.
2 // distinct() Methode
3 //-----------------------------------------
 Erklärung: count() Methode  4 db.persons.insertMany([
5 { name : "Andreas", age : 21},
‚ Mit der count() Methode kann auf einfache Weise
6 { name : "Christian", age : 23}
bestimmt werden, wieviele Dokumente im Resultset
7 ]);
einer Abfrage enthalten sind.
8

9 db.persons.distinct(’name’);
 Codebeispiel: count() Methode 
10 > ["Andreas", "Christian"]
1 //-----------------------------------------
2 // count() Methode
3 //----------------------------------------- q
4 db.inventory.insertMany([{
5 item : "journal", 22.2.3 Abfragemethode: group()
6 qty : 25,
7 }, { Die group() Methode gruppiert die Daten einer Col-
8 item : "notebook", lection anhand eines Schlüssels. Für die gruppierten
9 qty : 50, Daten können einfache Operationen wie das Zählen
10 } bzw. das Aufsummieren von Werten durchgeführt wer-
11 ]); den.
12
 Auflistung: group() Parameter 
13 db.inventory.count();
14 > 2 ‚ key: Das key Attribut bestimmt die Werte nach de-
15
nen die Dokumente einer Collection gruppiert wer-
16 db.inventory.find( den sollen.
17 { gty : { $gte : 20}} ‚ reduce: Die reduce Funktion definiert in welcher
18 ).count(); Form die Dokumente einer Gruppe verarbeitet wer-
19 > 1 den sollen. Die Funktion wird für jedes Dokument
einer Gruppe aufgerufen.
q

179
Informationssysteme

‚ initial: Bevor die reduce Funktion durch die Mon- 22.3. Aggregatframework 
goDB Engine ausgeführt wird, können in einem In-
itialisierungsschritt Variablen definiert und initia- Das Aggregatframework erlaubt komplexe Auswertun-
lisiert werden. gen für Dokumente in mehreren Collections.
‚ finalize: Müssen nach dem Ausführen der reduce Die Basis des Aggregatframeworks ist die Aggrega-
Methode weitere Berechnungen durchgeführt wer- tionspipeline.
den, können diese optional in Form einer Funktion
definiert werden.
22.3.1 Aggregationspipeline

 Codebeispiel: group() Methode 


1 //----------------------------------------- L Datenstruktur Pipeline 
2 // group() Methode Eine Pipeline ist eine Datenstruktur zur Verar-
3 //----------------------------------------- beitung von Daten.
4 db.persons.insertMany([
5 { name : "Andreas", age : 21}, Eine Pipeline besteht dabei aus mehreren Stu-
6 { name : "Melanie", age : 21}, fen. Je nach Pipelinestufe werden Daten un-
7 { name : "Michael", age : 14}, terschiedlich verarbeitet.
8 { name : "Alexander", age : 24},
9 { name : "Michael", age : 34} Eine Aggregationspipeline legt eine Kette von Ope-
10 ]); rationen fest.
11  Erklärung: Aggregationspipeline 
12
‚ Eine Aggregationspipeline legt eine Kette von Ope-
13 // Fuer jeden Namen soll ermittelt werden rationen, zur Verarbeitung der Dokumente einer
14 // wieoft er vergeben wurde. Collection fest. Für jede Operation wird dazu ein
15 db.persons.group({ eigener Operator definiert.
16 key : { name : 1 },
17 initial : { count : 0 }, ‚ Die MongoDB Spezifikation definiert keine Restrik-
18 reduce : function (curr, result) { tionen für die Zusammensetzung einer Pipeline. Le-
19 result.count++; diglich die $out Stufe muß als letzte Stufe einer Pi-
20 } peline auftreten.
21 }); ‚ In der Pipeline werden die Dokumente einer Col-
22
lection von einer Stufe zur nächsten Stufe weiter-
23 //----------------------------------------- gereicht und verarbeitet. Die Ausgabe einer Pipeli-
24 // Ausgabe: group() Methode nestufe dient dabei als Eingabe der nachfolgenden
25 //----------------------------------------- Stufe.
26 [
27 { ‚ Dabei muss ein Dokument nicht gezwungerdermas-
28 name : "Andreas", sen an die nächste Pipelinestufe weitergereicht wer-
29 count : 1 den. In einer Pipelinestufe können neue Dokumente
30 }, { erzeugt bzw. vorhandene Dokumente aus der Pipe-
31 name : "Melanie", line entfernt werden.
32 count : 1 ‚ Innerhalb einer Stufe kann die Struktur von Doku-
33 }, { menten verändert bzw. die Daten eines Dokuments
34 name : "Alexander", geändert werden.
35 count : 1
q
36 }, {
37 name : "Michael",
38 count : 2
39 }
40 ]

180
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 54. Aggregationspipeline

22.3.2 Aggregatframework 22.3.3 Methode: aggregate()

Das Aggregationsframework basiert auf 2 Grundprin- Zur Verarbeitung einer Aggregationspipeline stellt die
zipien: MongoDB Spezifikation die aggregate() Methode zur
Verfügung.
 Prinzipien: Aggregatframework 
 Syntax: Methode aggregate 
 Pipelineverarbeitung  1 //-----------------------------------------
2 // Syntax: aggregate()
Das Herzstück des Aggregatframework ist die
3 //-----------------------------------------
Aggregationspipeline.
4 db.<collection>.aggregate(<pipeline>);
Die Pipeline legt eine Kette von Operationen, 5

zur Verarbeitung der Dokumente einer Collec- 6 //-----------------------------------------


tion fest. 7 // Beispiel: aggregate()
8 //-----------------------------------------
9 db.projects.aggregate([
3 Expressions:  10 {
Expressions werden zur Verarbeitung der Do- 11 $match : {
kumente einer Pipelinestufe verwendet. 12 $nor : [
13 {type : "RESEARCH_PROJECT"},
14 {type : "REQUST_PROJECT"}
 Erklärung: Pipelineexpressions  15 ]
‚ Expressions werden zur Verarbeitung von Daten 16 }
innerhalb einer Pipelinestufe verwendet. 17 }, {
18 $project : {
‚ Eine Expression hat dabei nur auf die Daten eines 19 type : 1, state : 1,
einzelnen Dokuments innerhalb einer Pipelinestufe 20 description : 1,
Zugriff. 21 subprojects : 1
‚ Bestimmte Expressions können nur in Kombination 22 }
mit bestimmten Pipelineoperatoren verwendet wer- 23 }
den. 24 { $sort : { follower_count : -1} }
25 ]);

q
q

181
Informationssysteme

Operator Beschreibung Referenz

$addFields Adds new fields to documents. Similar to $project, $addFields reshapes each document in 186
the stream; specifically, by adding new fields to output documents that contain both the
existing fields from the input documents and the newly added fields.

$bucket Categorizes incoming documents into groups, called buckets, based on a specified expres- 192
sion and bucket boundaries.

$count Returns a count of the number of documents at this stage of the aggregation pipeline. 186

$group Groups input documents by a specified identifier expression and applies the accumulator 191
expression(s), if specified, to each group. Consumes all input documents and outputs one
document per each distinct group. The output documents only contain the identifier field
and, if specified, accumulated fields.

$limit Passes the first n documents unmodified to the pipeline where n is the specified limit. For each 185
input document, outputs either one document (for the first n documents) or zero documents
(after the first n documents).

$lookup Performs a left outer join to another collection in the same database to filter in documents 188
from the “joined” collection for processing.

$match Filters the document stream to allow only matching documents to pass unmodified into the 184
next pipeline stage. $match uses standard MongoDB queries. For each input document,
outputs either one document (a match) or zero documents (no match).

$out Writes the resulting documents of the aggregation pipeline to a collection. To use the $out 185
stage, it must be the last stage in the pipeline.

$project Reshapes each document in the stream, such as by adding new fields or removing existing 186
fields. For each input document, outputs one document.

$skip Skips the first n documents where n is the specified skip number and passes the remaining 184
documents unmodified to the pipeline. For each input document, outputs either zero docu-
ments (for the first n documents) or one document (if after the first n documents).

$sort Reorders the document stream by a specified sort key. Only the order changes; the docu- 184
ments remain unmodified. For each input document, outputs one document.

$unwind Deconstructs an array field from the input documents to output a document for each ele- 185
ment. Each output document replaces the array with an element value. For each input do-
cument, outputs n documents where n is the number of array elements and can be zero for
an empty array.

Abbildung 55. Pipelinestufen

. .

182
© Dipl.Ing.-Paul Panhofer Bsc.

22.3.4 Pipelinestufen 22.3.5 Fallbeispiel: Projects

Jede Pipelinestufe wird durch eine Pipelineoperator Folgenden Dokumente werden als Datenbasis für die
definiert. nachfolgenden Abfragen verwendet.

 Auflistung: Pipelinestufen 
 Codebeispiel: projects Dokument 
ü match Stufe  1 //-----------------------------------------
2 // Fallbeispiel: projects collection
Die match Stufe wird verwendet um die Do- 3 //-----------------------------------------
kumente im Dokumentenstrom der Pipeline zu 4 db.projects.insertMany([{
filtern. 5 _id : ObjectId("...1"),
6 title : "Produktionsplanungssysteme",
L project Stufe  7 type : "REQUEST_PROJECT",
8 state : "APPROVED",
Die project Stufe der Aggregationspipeline 9 fundings : [{
erlaubt die Manipulation von Dokumenten 10 debitorName : "SAP Microsystems",
durch das Umbenennen, Hinzufügen bzw. Ent- 11 amount : NumberLong(10000)
fernen von Attributen. 12 }
13 ],
14 reviews : [ 4,4,3,3,4 ]
® limit Stufe 
15 },{
Mit dem limit Operator kann die Anzahl der 16 _id : ObjectId("...2"),
Dokumente im Dokumentenstrom der Pipeline 17 title : "Finite Elemente",
limitiert werden. 18 type : "RESEARCH_PROJECT",
19 state : "IN_APPROVEMENT",
20 fundings : [{
r group Stufe 
21 debitorName : "TU Wien",
Mit dem group Operator können Auswertun- 22 amount : NumberLong(5000)
gen über alle Dokumente einer Pipelinestufe 23 }, {
hinweg, durchgeführt werden. 24 debitorName : "Oracle Systems.",
25 amount : NumberLong(15000)
26 }
3 lookup Stufe  27 ],
Mit dem lookup Operator können die Doku- 28 reviews : [ 5,5,3 ]
mente einer Pipelinestufe mit den Dokumen- 29 },{
ten anderer Collections in Relation gesetzt 30 _id : ObjectId("...3"),
werden. 31 title : "Simulatinssysteme",
32 type : "MANAGEMENT_PROJECT",
33 state : "IN_APPROVEMENT",
 unwind Stufe  34 fundings : [{
Mit dem unwind Operator können Arrays in 35 debitorName : "Sun Microsystems",
Dokumenten zur späteren Verarbeitung auf- 36 amount : NumberLong(45000)
gelöst werden. 37 }, {
38 debitorName : "Oracle Systems.",
39 amount : NumberLong(15000)
 out Stufe  40 }
41 ],
In der out Stufe werden die Dokumente der
42 reviews : [ 4,5,4,5,5 ]
vorhergehenden Pipelinestufe in eine Collec-
43 }
tion geschrieben.
44 ]);

q q

183
Informationssysteme

22.4. Dokumentstufen  22.4.2 Dokumente sortieren - $sort

‚ Mit dem sort Operator können die Dokumente im


L Dokumentstufen  Dokumentenstrom der gegebenen Pipelinestufe sor-
tiert werden.
Mit Dokumentstufen kann die Anzahl der Do-
kumente im Dokumentenstrom einer Pipeline ‚ 1 steht dabei für eine aufsteigende, -1 für eine ab-
verändert werden. steigende Sortierung.

 Syntax: $sort Operator 


1 //-----------------------------------------
22.4.1 Dokumente filtern - $match
2 // Syntax: $sort Operator
Die match Stufe wird verwendet um Dokumete im Do- 3 //-----------------------------------------
kumentenstrom der Pipeline zu filtern. 4 db.<collection>.aggregate([
5 { $sort : {
 Erklärung: $match Stufe  6 <sort-key> : <sort-order>
‚ Dokumente, die die in der Stufe definierten Filter- 7 }
bedingungen erfüllen, werden unverändert an die 8 }
nächste Pipelinestufe weitergegeben. Alle anderen 9 ]);
Dokumente werden verworfen. 10

11 //-----------------------------------------
‚ Filterbedingungen werden als Query Kriterien for-
12 // Beispiel: $sort Stufe
muliert.
13 //-----------------------------------------
 Syntax: $match Operator  14 db.projects.aggregate([
1 //----------------------------------------- 15 {$match:{type:"REQUEST_PROJECT"}},
2 // Syntax: $match Operator 16 { $sort :
3 //----------------------------------------- 17 { title : -1 }
4 db.<collection>.aggregate([ 18 }
5 { $match : <query criteria>} 19 ]);
6 ]);
7 q
8 //-----------------------------------------
9 // Beispiel: $match Stufe
22.4.3 Dokumente entfernen - $skip
10 //-----------------------------------------
11 db.projects.aggregate([ Der skip Operator wird verwendet um Dokumente aus
12 { $match : { dem Dokumentstrom der Pipeline zu entfernen.
13 $nor : [
14 {type: "MANAGEMENT_PROJECT"},  Syntax: $skip Operator 
15 {type: "REQUEST_PROJECT" }, 1 //-----------------------------------------
16 ], 2 // Syntax: $skip Operator
17 {state : "IN_APPOINTMENT"}, 3 //-----------------------------------------
18 4 db.<collection>.aggregate([
19 } 5 { $skip : <number_of_documents> }
20 } 6 ]);
21 ]); 7

22 8 //-----------------------------------------
23 db.projects.aggregate([ 9 // Beispiel: $skip Stufe
24 { $match : { 10 //-----------------------------------------
25 {reviews : {$size : 4}} 11 db.projects.aggregate([
26 } 12 { $match : {type : "REQUEST_PROJECT"} },
27 } 13 { $skip : 1 }
28 ]); 14 ]);

q q

184
© Dipl.Ing.-Paul Panhofer Bsc.

22.4.4 Arrays auflösen - $unwind 22.4.5 Dokumentenstrom einschränken - $limit

Mit dem unwind Operator können in Dokumenten de-


finierte Arrays aufgelöst werden. Mit dem limit Operator kann die Zahl der Dokumente
im Dokumentenstrom limitiert werden.
 Codebeispiel: $unwind Operator 
‚ Mit dem $unwind Operator werden Arrays struk-  Syntax: $limit Operator 
turell aufgelöst. Für jedes Arrayelement wird ein 1 //-----------------------------------------
eigenes Dokument generiert. 2 // Syntax: $limit Operator
3 //-----------------------------------------
 Syntax: $unwind Operator  4 db.<collection>.aggregate([
1 //----------------------------------------- 5 { $limit : { <number_of_documents> }}
2 // Syntax: $unwind Operator 6 ]);
3 //----------------------------------------- 7

4 db.<collection>.aggregate([ 8 //-----------------------------------------
5 { $unwind : <fieldname> } 9 // Beispiel: $limit Stufe
6 ]); 10 //-----------------------------------------
7 11 db.projects.aggregate([
8 db.projects.aggregate([ 12 { $match : {type : "REQUEST_PROJECT"} },
9 { $match : {type:"MANAGEMENT_PROJECT"}}, 13 { $limit : 5 }
10 { $unwind : "reviews" }, 14 ]);
11 { $project :
12 { title:1, type: 1, reviews : 1 }
q
13 },
14 { $out : "projectreport" }
15 ]); 22.4.6 Ergebnis abspeichern - $out
16

17 //----------------------------------------- Der out Operator finalisiert die Pipeline und schreibt


18 // Ausgabe: $unwind Stufe die Dokumente des Dokumentenstroms in eine Collec-
19 //----------------------------------------- tion.
20 {  Erklärung: $out Operator 
21 title : "Simulationssysteme"
‚ In der out Stufe werden die Dokumente des Doku-
22 type : "MANAGEMENT_PROJECT"
mentenstroms der vorhergehenden Pipelinestufe in
23 reviews : 4
eine Collection geschrieben.
24 }, {
25 title : "Simulationssysteme"
26 type : "MANAGEMENT_PROJECT"  Syntax: $out Operator 
27 reviews : 5 1 //-----------------------------------------
28 }, { 2 // Syntax: $out Operator
29 title : "Simulationssysteme" 3 //-----------------------------------------
30 type : "MANAGEMENT_PROJECT" 4 db.<collection>.aggregate([
31 reviews : 4 5 { $out : <name_of_collection> }
32 }, { 6 ]);
33 title : "Simulationssysteme" 7

34 type : "MANAGEMENT_PROJECT" 8 //-----------------------------------------


35 reviews : 5 9 // Beispiel: $out Stufe
36 }, { 10 //-----------------------------------------
37 title : "Simulationssysteme" 11 db.projects.aggregate([
38 type : "MANAGEMENT_PROJECT" 12 { $match : {type:"RESEARCH_PROJECT"} },
39 reviews : 5 13 { $out : "projectreport" }
40 } 14 ]);

q q

185
Informationssysteme

22.5. Strukturstufen   Ergebnis: $addFields Operator 


1 //-----------------------------------------
2 // Ergebnis: projects collection
L Strukturstufen  3 //-----------------------------------------
Mit Strukturstufen kann die Struktur der Doku- 4 {
mente im Dokumentenstrom der Pipeline ver- 5 _id : ObjectId("...1"),
ändert werden. 6 title : "Produktionsplanungssysteme",
7 type : "REQUEST_PROJECT"
8 state : "APPROVED"
9 fundings :[
22.5.1 Felder hinzufügen - $addFields
10 {
Mit dem addFields Operator können neue Felder zu 11 debitorName : "SAP Microsystems",
Dokumenten hinzugefügt werden. 12 amount : NumberLong(10000)
13 }, {
 Syntax: $addFields Operator  14 debitorName : "Oracle Systems",
1 //----------------------------------------- 15 amount : NumberLong(15000)
2 // Syntax: $addFields Operator 16 }
3 //----------------------------------------- 17 ],
4 db.<collection>.aggregate([ 18 reviews : [
5 { $addFields : 19 4,4,3,3,4
6 { <newField> : <expression> } 20 ],
7 } 21 keyword : ["initialised"],
8 ]); 22 groupCount : 5
9 23 verified : true,
10 //----------------------------------------- 24 voteCount : 18,
11 // Beispiel: $addFields Stufe 25 minVote : 3,
12 //----------------------------------------- 26 maxVote : 4
13 db.projects.aggregate([ 27 },
14 { $match : {type: "MANAGEMENT_PROJECT"}}, 28 {
15 { $addFields : { 29 _id : ObjectId("...2"),
16 //Konstante Werte hinzufuegen 30 title : "Finite Elemente im SimuLink",
17 verified : true, 31 type : "RESEARCH_PROJECT"
18 keyword : [ "initialised" ], 32 state : "IN_APROVEMENT"
19 33 fundings :[
20 //Aggregatoperatoren auf Arrays 34 {
21 voteCount : { 35 debitorName : "TU Wien",
22 $sum : "$reviews" 36 amount : NumberLong(5000)
23 }, 37 },{
24 minVote : { 38 debitorName : "Oracle Systems",
25 $min : "$reviews" 39 amount : NumberLong(15000)
26 }, 40 }
27 maxVote : { 41 ],
28 $max : "$reviews" 42 keyword : ["initialised"],
29 }, 43 reviews : [ 5,5,3 ],
30 groupCount : { 44 groupCount : 3,
31 $size : "$reviews" 45 verified : true,
32 } 46 voteCount : 13,
33 } 47 minVote : 3,
34 } 48 maxVote : 5
35 ]); 49 }

186
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 56. Stufentypen

22.5.2 Felder projizieren - $project  Syntax: $project Operator 


1 //-----------------------------------------
Mit dem project Operator können die Daten eines Do-
2 // Syntax: $project
kuments auf eine Untermenge seiner Attribute be-
3 //-----------------------------------------
schränkt werden.
4 db.<collection>.aggregate([
Im Gegensatz zur addFields Stufe werden Doku- 5 { $project : {<fieldname : (0|1)> }}
mente auf jene Attribute beschränkt, die Teil der 6 ]);
Projektion sind. 7

8 //-----------------------------------------
 Erklärung: $project Operator  9 // Beispiel: $project Stufe
‚ Mit dem $project Operator kann die Struktur der 10 //-----------------------------------------
Dokumente im Dokumentenstrom der Pipeline ver- 11 db.projects.aggregate([
ändert 9 werden. 12 { $match : {type:"MANAGEMENT_PROJECT"}}
13 { $project : {
‚ Es werden dabei nur jene Daten eines Dokuments
14 //Felder projizieren
an die nächste Pipelinestufe weitergegeben, die Teil
15 title : 1,
der Projektion sind.
16 reviews : 1,
 Syntax: $project Operator  17

18 //Felder umbenennen
‚ Der $project Operator erwartet ein Objekt als Pa-
19 projectType : "$type",
rameter.
20 projectState : "$state",
‚ Die Attribute des Objekts definieren dabei welche 21

Felder eines Dokuments in das Ergebnis der Pipeli- 22 //Aggregatoperatoren fuer Arrays
nestufe übernommen werden sollen. 23 maxVote : {
24 $max : "$reviews"
‚ Gleichzeitig können neue Attribute für ein Doku-
25 },
ment definiert werden.
26 minVote : {
‚ Mit dem $ Operator kann dabei auf die Attribute- 27 $min : "$reviews"
werte eines Dokuments zugegriffen werden. 28 }
29 }
30 }
31 ]);
9
Hinzufügen, Entfernen, Ändern von Attributen

187
Informationssysteme

 Ergebnis: $project Operator  22.6. Beziehungsstufen 


1 //-----------------------------------------
2 // Ergebnis: $project Stufe
3 //----------------------------------------- L Beziehungsstufen 
4 {
Mit der Hilfe von Beziehungsstufen können Da-
5 title : "Simulationssysteme",
ten aus mehreren Collections miteinander in
6 projectType : "MANAGEMENT_PROJECT",
Relation gesetzt werden.
7 reviews : [4,5,4,5,5],
8 maxVote : 5,
9 minVote : 4
10 } 22.6.1 Joins zwischen Collections

Die Aggregationspipeline unterstützt 3 Formen von


q Relationen zwischen den Dokumenten mehrerer Col-
lections.
22.5.3 Dokumentwurzel ändern - $replaceRoot
 Auflistung: Join Typen 

Mit dem replaceRoot Operator kann die Struktur der  Relation: left join 
Dokumente im Dokumentenstrom der Pipeline geän-
dert werden. Der $lookup Operator kann verwendet wer-
den um einen left join zwischen den Doku-
 Codebeispiel: $replaceRoot Operator  menten 2er Collections zu definieren.
1 //-----------------------------------------
2 // Syntax: $replaceRoot Operator
 Relation: subselect 
3 //-----------------------------------------
4 db.<collection>.aggregate([ Der $lookup Operator kann verwendet wer-
5 { $replaceRoot : { den, um mehrere Pipelines miteinander in Re-
6 newRoot : <replacementDocument> lation zu setzen.
7 }
8 }
9 ]);
( Relation: recursive join 
10 Mit dem $graphlookup Operator können Ab-
11 //----------------------------------------- fragen auf hierarchischen Strukturen durch-
12 // Beispiel: $replaceRoot Stufe geführt werden.
13 //-----------------------------------------
14 db.tweets.aggregate([ q
15 { $match : { lang : "en" } },
16 {
17 $replaceRoot : { 22.6.2 Collections verbinden - $lookup
18 newRoot : "$user"
Mit dem lookup Operator kann ein left join zwischen
19 }
den Dokumenten 2er Collections definiert werden.
20 }
21 ]);
 Attribute: $lookup Operator 
22

23 > Ausgabe ‚ from: Der Name der Collection deren Daten das Ziel
der Beziehung sind.
24 account : {
25 name : "Jonas Nagelmaier", ‚ localField: Der Name des Attributes der Joinbedin-
26 verified : false, gung der Dokumente der Basiscollection.
27 rating : 5,
28 state : "initialised" ‚ foreignField: Der Name des Attributes in der zu

29 } joinenden Collection.
‚ as: Ein Array das die gejointen Datensätze enthält.
q

188
© Dipl.Ing.-Paul Panhofer Bsc.

 Syntax: $lookup Operator   Codebeispiel: $lookup Operator 


1 //----------------------------------------- 1 //-----------------------------------------
2 // Syntax: $lookup Operator 2 // Beispiel: $lookup Stufe
3 //----------------------------------------- 3 //-----------------------------------------
4 db.<collection>.aggregate([ 4 db.subprojects.aggregate([
5 { $lookup : { 5 { $match : { title : "ERP SAP"} },
6 from : <collection to join>, 6 { $lookup : {
7 localField : <field input document>, 7 from : "projects",
8 foreignField : <extern join field>, 8 localField : "project_id",
9 as : <output array field> 9 foreignField : "_id",
10 } 10 as : "project"
11 } 11 }
12 ]); 12 }, {
13 13 $project : {
14 //----------------------------------------- 14 appliedResearch : 1,
15 // Fallbeispiel : subprojects 15 _id : 0, title : 1,
16 //----------------------------------------- 16 focusResearch : 1,
17 db.subprojects.insertMany([ 17 facility : 1,
18 { 18 project : 1
19 _id : ObjectId(...11), 19 }
20 appliedResearch : NumberInt(20), 20 }, {
21 focusResearch : NumberInt(80), 21 $sort : { title : 1 }
22 project _id : ObjectId(...1), 22 }, {
23 title : "ERP SAP", 23 $out : "subprojectReport"
24 facility : { 24 }
25 name : "Softwaretechnikinstitut", 25 ]);
26 _id : ObjectId(...23) 26

27 } 27 //-----------------------------------------
28 }, { 28 // Ergebnis: $lookup Stufe
29 _id : ObjectId(...12), 29 //-----------------------------------------
30 appliedResearch : NumberInt(40), 30 {
31 focusResearch : NumberInt(60), 31 appliedResearch : NumberInt(20),
32 project_id : ObjectId(...1), 32 focusResearch : NumberInt(80),
33 title : "Webbased Systems", 33 title : "ERP SAP",
34 facility : { 34 facility : {
35 name : "Datenbankeninstitut", 35 name : "Softwaretechnikinstitut",
36 _id : ObjectId(...45), 36 _id : ObjectId(...23)
37 } 37 },
38 }, { 38 project : {
39 _id : ObjectId(...13), 39 id : ObjectId("...1"),
40 appliedlResearch : NumberInt(80), 40 title : "Produktionsplanungssysteme",
41 focusResearch : NumberInt(10), 41 type : "REQUEST_PROJECT",
42 project_id : ObjectId(...2), 42 reviews : [
43 title : "Embedded Systems" 43 4,4,3,3,4
44 }, { 44 ],
45 _id : ObjectId(...14), 45 fundings : [{
46 appliedResearch : NumberInt(10), 46 debitorName : "..."
47 focusResearch : NumberInt(80), 47 }]
48 project_id : ObjectId(...3), 48 }
49 title : "API Design SAP" 49 }
50 ]);
q

189
Informationssysteme

22.6.3 Unterabfrage definieren - $lookup  Codebeispiel: $lookup Operator 


1 //-----------------------------------------
Der $lookup Operator kann verwendet werden um
2 // Beispiel: $lookup Operator
mehrere Pipelines in Relation zu setzen.
3 //-----------------------------------------
 Erklärung: $lookup Operator  4 db.subprojects.aggregate([
5 { $match : {
‚ In der lookup Stufe kann eine Unterabfrage in Form
6 $where : function(){
einer Pipeline definiert werden.
7 return this.appliedResearch +
‚ Die Datenströme der Pipelines können dabei unter- 8 this.theoreticalResearch +
einander Daten austauschen. 9 this.focusResearch
10 == 100;
 Syntax: $lookup Operator 
11 }
1 //----------------------------------------- 12 }
2 // Syntax: $lookup Operator 13 }, {
3 //----------------------------------------- 14 $lookup : {
4 db.<collection>.aggregate([ 15 from = "projects",
5 { $lookup : { 16 let : { project : "$project_id" },
6 from : <collection to join>, 17 pipeline : [
7 let : { 18 {
8 <var_1> : <expression>, 19 $match : {
9 }, 20 $expr : {
10 pipeline : [ 21 $eq :
11 <pipeline to execute on ["$_id","$$project"]
collection> 22 }
12 ], 23 }
13 as : <output array field> 24 }, {
14 } 25 $project : {
15 } 26 _id : 0,
16 ]); 27 projectState : 1,
17
28 projectType : 1,
18 $lookup : { 29 fundings : 1,
19 from : "projects", 30 title : 1
20 // Kommunikation zwischen Pipelines 31 }
21 let : { project : "$project_id"}, 32 }
22 pipeline : [ 33 ],
23 { $match : { 34 as : "project"
24 // Pipelinevariablen vergl. 35 }
25 $expr : { 36 }, {
26 $eq : [ 37 $project : {
27 "$_id", 38 title : 1, project : 1,
28 "$$project" 39 facility : 1
29 ] 40 }
30 } 41 }, {
31 } 42 $addFields : {
32 }, 43
33 {$match : {type:"REQUEST_PROJECT"}}, 44 }
34 { 45 }, {
35 $project : { title : 1, type :1} 46 $out : "subprojectReport"
36 } 47 }
37 ], 48 ]);
38 as : "data"
39 }
q

190
© Dipl.Ing.-Paul Panhofer Bsc.

22.7. Aggregatstufen  22.7.2 Dokumente gruppieren - $group

Mit dem $group Operator können die Dokumente der


gegenwärtigen Pipelinestufe anhand eines Schlüssels
L Aggregatstufen 
gruppiert werden.
Aggregatstufen verarbeiten die Daten einer
 Syntax: $group Operator 
Pipelinestufe auf Collection- statt auf Doku-
mentebene. 1 //-----------------------------------------
2 // Syntax: $group Operator
Damit haben Aggregatoperatoren innerhalb 3 //-----------------------------------------
einer Pipelinestufe Zugriff auf die Daten aller 4 db.<collection>.aggregate([
Dokumente der gegenwärtigen Stufe. 5 { $group : {
6 id : <grouped_by_fieldname>,
Aggregatstufen werden aus diesem Grund in erster 7 <aggregated_fieldname> : {expression}
Linie im Reporting verwendet. 8 }}
9 ]);
10
22.7.1 Reporting 11 //-----------------------------------------
12 // Beispiel: $group
 Reporting  13 //-----------------------------------------
14 // Ermitteln Sie wieviele Projekte es pro
Als Reporting wird eine der Disziplinen der Da- 15 // Projekttyp gibt
tenverarbeitung bezeichnet. 16 db.projects.aggregate([
Das Hauptaugenmerk des Reporting liegt da- 17 { $match : {type:{ $ne:"MANAGEMENT"}}}
bei in der expliziten Informationsgewinnung 18 {
aus vorhandenen Daten. 19 $group : {
20 _id : "$type",
21 projectCount : {
 Erklärung: Aggregat- vs. Dokumentstufen  22 $sum : 1
‚ Der Input einer Pipelinestufe besteht aus den Doku- 23 }
menten des Dokumentenstroms der vorhergehen- 24 }
den Pipelinestufe. 25 }, {
26 $project : {
‚ Dabei werden die Dokumente des Dokumenten- 27 projectType : "$_id",
stroms nacheinander eingelesen und verarbeitet. Pi- 28 projectCount : 1
pelineoperatoren können damit nur auf die Daten 29 }
eines einzelnen Dokuments zugreifen. 30 }, {
‚ Aggregatstufen verarbeiten im Vergleich dazu Daten 31 $limit : 5
auf Collectionebene. 32 }, {
33 $out : "projectReport"
‚ Aggregatoperatoren haben dabei innerhalb einer Pi- 34 }
pelinestufe Zugriff auf die Daten aller Dokumente 35 ]);
der gegenwärtigen Stufe. 36

37 > Ausgabe
q
38 {
39 projectType : "REQUEST_FUNDING_PROJECT",
40 projectCount : 2
41 }, {
42 projectType : "RESEARCH_FUNDING_PROJECT",
43 projectCount : 2
44 }

191
Informationssysteme

Feld Typ Beschreibung

groupBy expression An expression to group documents by. To specify a field path, prefix the field name with
a dollar sign $ and enclose it in quotes.

boundaries array An array of values based on the groupBy expression that specify the boundaries for each
bucket. Each adjacent pair of values acts as the inclusive lower boundary and the exclu-
sive upper boundary for the bucket. You must specify at least two boundaries.

default literal Optional. A literal that specifies the _id of an additional bucket that contains all do-
cuments whose groupBy expression result does not fall into a bucket specified by
boundaries.

output document Optional. A document that specifies the fields to include in the output documents in addi-
tion to the _id field. To specify the field to include, you must use accumulator expressions.

Abbildung 57. bucket Attribute

22.7.3 Dokumente gruppieren - $bucket  Codebeispiel: $bucket Operator 


1 //-----------------------------------------
Mit dem $bucket Operator können die Dokumente
2 // Beispiel: $bucket Stufe
der gegenwärtigen Pipelinestufe anhand eines Schlüs-
3 //-----------------------------------------
sels gruppiert werden.
4 db.subprojects.aggregate([
 Erklärung: $bucket Operator  5 { $bucket : {
‚ Im Gegensatz zur group Stufe, wird jedoch nicht für 6 groupBy : "$appliedResearch",
jeden Wert des Schlüsselattibuts eine eigenen Unter- 7 boundaries : [0, 51, 101],
gruppe definiert. 8 output : {
9 count :: { $sum : 1},
‚ Untergruppe werden durch die Angabe eines Inter- 10 titles : {
valls von Werten definiert. 11 $push : "$title"
12 }
 Syntax: $bucket Operator 
13 }
1 //-----------------------------------------
14 }
2 // Syntax: $bucket Operator
15 }
3 //-----------------------------------------
16 ]);
4 db.<collection>.aggregate([
17
5 {
18 > Ausgabe
6 $bucket : {
19
7 groupBy : <expression>,
20 { _id : 0, count : 2,
8 boundaries : [<lowerbound1>, ...],
21 users : [
9 default : <literal>,
22 "ERP SAP", "Webbased Systems"
10 output : {
23 ]
11 <output1 : {<$expression>},
24 }, {
12 <output2 : {<$expression>},
25 _id : 51, count : 1,
13 <output3 : {<$expression>}
26 users : [
14 ...
27 "Embedded Systems"
15
28 ]
16 }
29 }
17 }
18 }]);
q

192
© Dipl.Ing.-Paul Panhofer Bsc.

22.8. Expressions   Codebeispiel: $cond Expression 


1 //-----------------------------------------
2 // Expression: $cond
3 Expressions:  3 //-----------------------------------------
Expressions werden zur Manipulation von Do- 4 db.projects.aggregate([
kumenten innerhalb von Pipelinestufen ver- 5 { $addField : {
wendet. Bei Expressions handelt es sich dabei 6 verified : {
um Operatoren. 7 $cond : {
8 if : {
Das Aggregatframework basiert auf 2 Grundprin- 9 $eq : ["$state", "APP"]
zipien: der Pipelineverarbeitung und den Pipeline- 10 },
expressions. 11 then : true,
12 else : false
 Erklärung: Pipelineexpressions  13 }
‚ Expressions sind Operatoren zur Verarbeitung von 14 }
Dokumenten. 15 }
16 }, {
‚ Expressions sind zustandslos. Sie beziehen sich im-
17 $project : {
mer auf das aktuell zu verarbeitetende Dokument.
18 _id : 0, title : 1
Es ist nicht möglich, auf Daten anderer Dokumente
19 type : 1, state : 1
Bezug zu nehmen.
20 verified : 1
q 21 }
22 }, {
23 $sort : { title : 1 }
22.9. Kontrollexpressions  24 }
25 ]);
26
L Kontrolloperatoren  27

Kontrolloperatoren ermöglichen eine kontext- 28 > Ausgabe


basierte Verarbeitung der Daten eines Doku- 29

ments. 30 db.projects.insertMany([{
31 _id : ObjectId("...2"),
32 title : "Finite Elemente Simulation",
22.9.1 $cond Operator 33 type : "RESEARCH_FUNDING_PROJECT",
34 state : "IN_APPROVEMENT",
Der $cond Operator ermöglicht die kontextbasierte 35 verified : false
Verarbeitung der Daten eines Dokuments. 36 },{
37 _id : ObjectId("...1"),
 Syntax: $cond Expression 
38 title : "Produktionsplanungssysteme",
1 //-----------------------------------------
39 type : "REQUEST_FUNDING_PROJECT",
2 // Syntax: $cond
40 state : "APPROVED",
3 //-----------------------------------------
41 verified : true
4 $cond : {
42 },{
5 if : <boolean-expression>,
43 _id : ObjectId("...3"),
6 then : <true-case>,
44 title : "Simulatinssysteme",
7 else : <false-case>
45 type : "MANAGEMENT_PROJECT",
8 }
46 state : "IN_APPROVEMENT",
9
47 verified : false
10 $cond : [
48 }
11 <boolean-expression>,
49 ]);
12 <true-case>, <false-case>
13 ]
q

193
Informationssysteme

22.9.2 $switch Operator 22.9.3 $cmp Operator

Der $switch Operator erlaubt die bedingte Verarbei- Mit der Hilfe des $cmp Operators können 2 Werte mit-
tung der Daten eines Dokuments. einander verglichen werden. Das Ergebnis des Ver-
gleichs ist dabei ein Integer.
 Syntax: $switch Expression 
 Erklärung: $cmp Operator 
1 //------------------------------------------
2 // Syntax: $switch
‚ Ist der erste Wert größer als der 2te ist das Ergebnis
des Vergleichs 1.
3 //------------------------------------------
4 $switch : { ‚ Ist der erste Wert kleiner dann ist das Ergebnis des
5 branches : [ Vergleichs -1.
6 {case : <exp>, then: <exp>},
7 {case : <exp>, then: <exp>},
‚ Sind die Werte gleich ist das Ergebnis 0.
8 {case : <exp>, then: <exp>},
9 ...  Codebeispiel: $cmp Expression 
10 ], 1 //------------------------------------------
11 default : <exp> 2 // Beispiel: $cmp
12 } 3 //------------------------------------------
13 //------------------------------------------ 4 db.tweets.insertMany([
14 // Expression: $switch 5 { _id : 1, item : "abc1", qty: 300 }
15 //------------------------------------------ 6 { _id : 2, item : "abc2", qty: 200 }
16 db.projects.aggregate([ 7 { _id : 3, item : "xyz1", qty: 250 }
17 { 8 ]);
18 $addFields : { 9

19 projectValue : { 10 //------------------------------------------
20 $switch : { 11 // Expression: $cmp
21 branches : [{ 12 //------------------------------------------
22 case : { 13 db.tweets.aggregate([
23 $eq : [ 14 {
24 "$type", 15 $project : {
25 "REQUEST_PROJECT" 16 item : 1,
26 ] 17 cmpTo250 : {
27 }, 18 $cmp : ["$qty", 250]
28 then : 10 19 },
29 }, { 20 _id : 0
30 case : { 21 }
31 $eq : [ 22 },
32 "$type", 23 ]);
33 "RESEARCH_PROJECT" 24

34 ] 25 > Ausgabe
35 }, 26 {
36 then : 20 27 item : "abc1",
37 }], 28 cmpTo250 : 1
38 default : "nemo" 29 }, {
39 } 30 item : "abc2",
40 } 31 cmpTo250 : -1
41 } 32 }, {
42 }, { 33 item : "xyz1",
43 $out : "tweetsreport" 34 cmpTo250 : 0
44 }]); 35 }

q q

194
© Dipl.Ing.-Paul Panhofer Bsc.

22.10. Arrayexpressions  22.10.2 $concatArrays Operator

Mit dem $concatArrays Operator können Elemente


aus unterschiedlichen Arrays in ein Zielarray übernom-
L Arrayoperatoren 
men werden.
Arrayoperatoren werden zur Verarbeitung von
 Codebeispiel: $concatArrays 
Arrays in Dokumenten verwendet.
1 //------------------------------------------
2 // Beispiel: $concatArrays
3 //------------------------------------------
22.10.1 $arrayElemAt Operator
4 db.warehouse.insertMany([
Der $arrayElemAt Operator extrahiert das Arrayele- 5 {
ment mit einem bestimmten Index aus einem Array. 6 instock : ["chocolate"],
7 ordered : ["butter","apples"]
 Codebeispiel: $arrayElemAt  8 }, {
1 //----------------------------------------- 9 instock : ["apples", "pudding", "pie"]
2 // Expression: $arrayElemAt 10 }, {
3 //----------------------------------------- 11 instock : ["ice cream"],
4 db.projects.aggregate([ 12 ordered : []
5 { 13 },
6 $match : { 14 ])
15
7 state : {
8 $ne : "REQUEST_PROJECT" 16 //------------------------------------------
9 } 17 // Expression: $concatArrays
10 } 18 //------------------------------------------
11 }, { $project : { 19 db.warehouse.aggregate([
12 _id: 0, title : 1, 20 { $project : {
13 funding : { 21 items : {
14 $arrayElemAt : ["$fundings", 0] 22 $concatArrays : [
15 } 23 "$instock", "$ordered"
16 } 24 ]
17 } 25 }
18 ]); 26 }
19
27 }, {
20 //----------------------------------------- 28 $out : "warehouseReport"
21 // Ausgabe: $arrayElemAt 29 }
22 //----------------------------------------- 30 ]);
31
23 db.projects.insertMany([{
24 title : "Finite Elemente", 32 > Ausgabe
33
25 funding : {
26 debitorName : "TU Wien", 34 { _id : ObjectId("......1"),
27 amount : NumberLong(5000) 35 items : [
28 } 36 "chocolate", "butter", "apples"
29 },{ 37 ]
30 title : "Simulatinssysteme", 38 }, {
31 funding : { 39 _id : ObjectId("......2"),
32 debitorName : "Sun Microsystems", 40 items : null
33 amount : NumberLong(45000) 41 }, {
34 } 42 _id : ObjectId("......3"),
35 } 43 items : [ "ice cream" ]
36 ]); 44 }

q q

195
Informationssysteme

22.10.3 $in Operator 22.10.4 $map Operator

Mit dem $in Operator kann geprüft werden ob ein ein Der $map Operator wird verwendet um die Elemente
Element in einem Array enthalten ist. eines Arrays zu verarbeiten.

 Codebeispiel: $in Expression   Codebeispiel: $map Operator 


1 //------------------------------------------ 1 //-----------------------------------------
2 // Beispiel: $in Operator 2 // Beispiel: $map Operator
3 //------------------------------------------ 3 //-----------------------------------------
4 db.warehouse.insertMany([{ 4 db.results.insertMany([
5 location : "24th Street", 5 { _id : 1, values : [ 5, 6, 7 ] },
6 in_stock : [ "apples", "oranges" ] 6 { _id : 2, values : [ ] },
7 }, { 7 { _id : 3, values : [ 3, 8, 9 ] }
8 location : "36th Street", 8 ])
9 in_stock : [ "bananas", "pears" ] 9
10 }, { 10 //-----------------------------------------
11 location : "82nd Street", 11 // Expression : $map Operator
12 in_stock : [ "apples" ] 12 //-----------------------------------------
13 } 13 db.results.aggregate([
14 ]) 14 $project : {
15
15 adjustedValues : {
16 //------------------------------------------ 16 $map : {
17 // Expression : $in Operator 17 input : "$values",
18 //------------------------------------------ 18 as : "value",
19 db.warehouse.aggregate([ 19 in : { $add : [ "$$value", 2 ] }
20 { $project : { 20 }
21 storeLocation : "$location", 21 }
22 bananaInStock : { 22 }
23 $in : [ 23 ]);
24 "bananas", "$in_stock" 24
25 ] 25 > Ausgabe
26 } 26 { _id : 1, adjustedValues : [ 7, 8, 9 ] }
27 } 27 { _id : 2, adjustedValues : [ ] }
28 }, { 28 { _id : 3, adjustedValues : [5, 10, 11 ]}
29 out : "warehouseReport"
30 }
31 ]); q
32

33 > Ausgabe
22.10.5 $filter Operator
34 { _id : ObjectId("...............1"),
35 storeLocation : "24th Street", Mit dem $filter Operator können die Elemente eines
36 bananaInStock : true Arrays nach bestimmten Kriterien gefiltert werden.
37 }, {
38 _id : ObjectId("...............2"),  Codebeispiel: $filter Expression 
39 storeLocation : "36th Street", 1 //------------------------------------------
40 bananaInStock : true 2 // Expression: $filter
41 },{ 3 //------------------------------------------
42 _id : ObjectId("...............4"), 4 $filter : {
43 storeLocation : "82nd Street", 5 input : <array>,
44 bananaInStock : false 6 as : <string>,
45 } 7 cond : <expression>
8 }
q

196
© Dipl.Ing.-Paul Panhofer Bsc.

1 //----------------------------------------- 22.10.6 $reduce Operator


2 // Beispiel: $filter
Mit dem $reduce Operator können die Elemente eines
3 //-----------------------------------------
Arrays auf eine einzelnen Wert verdichtet werden.
4 // Ermitteln des Projekts mit der hoechsten
5 // Foerderung
 Syntax: $reduce Operator 
6

7 db.projects.aggregate([ 1 //-----------------------------------------
8 { $addFields : { 2 // Expression: $reduce Operator
9 projectFunding : { 3 //-----------------------------------------
10 $max : { 4 $reduce: {
11 "$sum" : "$fundings.amount" 5 input: <array>,
12 } 6 initialValue: <expression>,
13 } 7 in: <expression>
14 } 8 }
9
15 }, {
16 $project : { 10 //-----------------------------------------
17 title : 1, projectFunding : 1 11 // Beispiel: $reduce Operator
18 } 12 //-----------------------------------------
19 }, { 13 // Fuegen Sie eine alle Elemente eines
20 $group : { 14 // Arrays zu einer einzelnen Zeichenkette
21 _id : null, 15 // zusammen.
22 maxFunding : {$max:"$projectFunding"}, 16
23 projects : { 17 // Hinweis: Der Operator definiert folgende
24 $addToSet : { 18 // Variablen
25 _id : "$_id", 19 // $value : Initialobjekt
26 funding : "$projectFunding" 20 // $this : aktuelle Element des Arrays
21
27 }
28 } 22 $reduce: {
29 } 23 input: ["Hallo ", "Welt"],
30 }, { 24 initialValue: "",
31 $project : { 25 in: {
32 projects : { 26 $concat : ["$$value", "$$this"]
33 $filter : { 27 }
34 input : "$projects", 28 }
29
35 as : "item",
36 cond : { 30 > Ausgabe : "Hallo Welt"
31
37 $eq : [
38 "$$item.funding", 32 // Berechnen Sie die Summe und das Produkt
39 "$maxFunding" 33 // der Elemente eines Arrays
40 ] 34 $reduce: {
41 } 35 input: [ 1, 2, 3, 4 ],
42 } 36 initialValue: { sum: 5 },
43 } 37 in: {
44 } 38 sum: {
45 }, { 39 $add : [ "$$value.sum", "$$this"]
46 $unwind : { 40 }
47 path : "$projects" 41 }
48 } 42 }
43
49 }
50 ]); 44 > Ausgabe
45 { sum : 15 }

q
q

197
Informationssysteme

22.11. Aggregatexpressions  22.11.2 $addToSet, $push Operator

Der $addToSet bzw. $push Operator ermöglicht die


Dokumente einer Gruppe in einem Array zu speichern.
L Aggregatoperatoren 
Aggregatoperatoren haben im Vergleich zu  Codebeispiel: $addToSet Expression 
anderen Expressions Zugriff auf die Daten aller 1 //-----------------------------------------
Dokumente im Dokumentenstrom der gegen- 2 // Beispiel: $addToSet
wärtigen Pipelinestufe. 3 //-----------------------------------------
4 db.sales.aggregate([
5 { $group: {
6 _id: "$category",
22.11.1 Fallbeispiel: sales
7 itemsSold: {
Für die nachfolgenden Abfragen bilden die folgenden 8 $addToSet: "$item"
Dokumente die Datenbasis. 9 }
10 }
 Codebeispiel: sales collection  11 }, {
1 //----------------------------------------- 12 $sort : { _id : 1 }
2 // Collection: sales 13 }, {
3 //----------------------------------------- 14 $out : "salesReport"
4 db.sales.insertMany([{ 15 }
5 _id : ObjectId("...1"), 16 ]);
6 category: "BOARD_GAME" 17

7 item : "abc1", 18

8 price : 10, 19 //-----------------------------------------


9 quantity : 2, 20 // Ergebnis: $addToSet
10 }, { 21 //-----------------------------------------
11 _id : ObjectId("...2"), 22 {
12 category : "PC_GAME" 23 _id : "BOARD_GAME",
13 item : "jkl", 24 itemsSold : [
14 price : 20, 25 "abc1", "abc3"
15 quantity : 1, 26 ]
16 }, { 27 }, {
17 _id : ObjectId("...3"), 28 _id : "BOOK",
18 category : "BOOK", 29 itemsSold : [
19 item : "xyz", 30 "xyz", "abc2"
20 price : 5, 31 ]
21 quantity : 5 32 }, {
22 }, { 33 _id : "PC_GAME",
23 _id : ObjectId("...4"), 34 itemsSold : [
24 category : "BOOK", 35 "jkl"
25 item : "abc2", 36 ]
26 price : 10, 37 }
27 quantity : 10
28 }, { q
29 _id : ObjectId("...5"),
30 category : "BOARD_GAME",
31 item : "abc3",
32 price : 10,
33 quantity : 10
34 }]);

198
© Dipl.Ing.-Paul Panhofer Bsc.

22.11.3 $min, $max Operatoren 22.11.4 $sum Operator

Mit dem $min bzw. $max Operatoren wird für einen be- Mit dem $sum Operator ist es möglich über die Doku-
stimmtes Attribut der maximale bzw. minimale Wert mente einer Gruppe hinweg eine Summe zu bilden.
auf Collectionebene ermittelt.
 Codebeispiel: $sum Operator 
 Syntax: $min, $max Operator  1 //------------------------------------------
1 //------------------------------------------ 2 // Syntax: $sum Operatoren
2 // Syntax: $min, $max Operatoren 3 //------------------------------------------
3 //------------------------------------------ 4 { $sum: <expression> }
4 { $min: <expression> } 5

5 { $max: <expression> } 6 //------------------------------------------


6 { $avg: <expression> } 7 // Beispiel: $sum Operatoren
7 8 //------------------------------------------
8 //------------------------------------------ 9 db.products.aggregate([
9 // Beispiel: $min, $max Operatoren 10 {
10 //------------------------------------------ 11 $match : {
11 db.sales.aggregate([ 12 type : {$ne:"MANAGEMENT_PROJECT"},
12 { 13 state : {$ne:"IN_APPROVEMENT"}
13 $group:{ 14 }
14 _id: "$category", 15 }, {
15 minQuantity: { $min: "$quantity" }, 16 $group : {
16 maxQuantity: { $max: "$quantity" }, 17 _id : "$type",
17 avgQuantity: { $avg: "$quantity" } 18 projectCount : {
18 } 19 $sum : 1
19 }, { 20 },
20 $sort : { 21 projects : {
21 _id : 1 22 $addToSet : "$title"
22 } 23 }
23 }, { 24 }
24 $out : "salesReport" 25 }, {
25 } 26 $out : "projectReport"
26 ]); 27 }
27 28 ]);
28 > Ausgabe 29

29 30

30 { _id : "BOARD_GAME", 31 > Ausgabe


31 minQuantity: 2, 32

32 maxQuantity: 10, 33 {
33 avgQuantity: 6 34 _id : "REQUEST_PROJECT"
34 }, { 35 projectCount : 1
35 _id : "BOOK", 36 projects : [
36 minQuantity: 5, 37 "Produktionsplanungssysteme"
37 maxQuantity: 10, 38 ]
38 avgQuantity: 7 39 }, {
39 }, { 40 _id : "RESEARCH_PROJECT"
40 _id : "PC_GAME", 41 projectCount : 1
41 minQuantity: 1, 42 projects : [
42 maxQuantity: 1, 43 "Finite Elemente"
43 avgQuantity: 1 44 ]
44 } 45 }

q q

199
Informationssysteme

. .

200
Informationssysteme - Theorieskriptum
.

Datenverarbeitung
Version 1.0
Informationssysteme

23. Daten - Datenverarbeitung 23.1. Datenverarbeitung 

23.1.1 Datenverarbeitung - Glossar

 Daten 
Daten sind Fakten die in Datenverarbeitungs-
systemen gespeichert werden.

z.B.: die Zeichenkette Herr der Ringe.

L Information 
Als Information werden Daten bezeichnet de-
ren Bedeutung bekannt ist.

z.B.: Ein Buch mit dem Titel Herr der Ringe.

3 Wissen 
Wissen bezeichnet Informationen, die mitein-
01. Datenverarbeitung 202
ander kombiniert werden können, um einen
Informationsgewinn zu erreichen.
02. Datenformate 203
z.B.: Karteisystem einer öffentlichen Bibliothek.

23.1.2 Datenverarbeitung

L Datenverarbeitung 
Datenverarbeitung bezeichnet den systemati-
schen Umgang mit Daten mit dem Ziel, Infor-
mationen aus Daten zu gewinnen bzw. Daten
zu verwalten.

 Erklärung: Datenverarbeitung 
‚ Prozess der Datenverarbeitung: Input - Daten-
verarbeitung - Output

‚ Datenverarbeitung ist die Grundlage für Handel,


Technik, Wirtschaft, Wissenschaft, Verwaltung etc.

‚ Daten sind die Grundlage der Datenverarbeitung.

202
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 58. Prozess der Datenverarbeitung

23.2. Datenformate  ‚ In der objektorientierten Programmierung ent-


spricht beispielsweise ein Objekt einem Datensatz.
Im Zuge der Datenverarbeitung werden Daten
zu Datensätzen zusammengefasst, verarbeitet und 1 //----------------------------------------
ausgegeben. 2 // Datensatz: Objekt
3 //----------------------------------------
@RequiredArgsConstructor
L | 
4

5 @NoArgsConstructor
6 @Data
7 @ToString
23.2.1 Datensätze
8 public class Employee implements Serializable{
9
L Datensatz  10 @NonNull
Ein Datensatz ist ein Gruppe von Daten, die zu- 11 @NotNull
einander in Beziehung stehen. 12 @Size(min=2, max=50)
13 private String firstName;
14

 Erklärung: Datensatz  15 @NonNull


16 @NotNull
‚ In der Datenverarbeitung werden Daten zu Daten-
17 @Size(min=2, max=50)
sätzen zusammengefasst.
18 private String lastName;
‚ Ein Datensatz stellt eine Sammlung von Daten dar. 19

20 @NonNull
z.B.: Dem Datensatz Person werden Informationen
21 @NotNull
über den Vornamen, Nachnamen usw. zugeordnet.
22 private String email;
23
‚ Datensätzen werden nur Daten zugeordnet, die in-
haltlich mit dem Datensatz in Beziehung stehen. 24 @NotNull
25 private Department department;
z.B.: Es macht keinen Sinn einem Personen Daten- 26
satz Informationen über den Stickstoffausstoss einer 27 }
Fabrikanlage zuzuordnen.

203
Informationssysteme

23.2.2 Datenformate 23.2.4 xml Datenformat

Xml ist eine Auszeichnungssprache zur Verarbeitung


L Datenformat  hierarchisch strukturierter Daten.
Das Datenformat bestimmt die Darstellung ei-
nes Datensatzes.  Erklärung: xml Datenformat 
‚ Die wichtigste Struktureinheit eines xml Doku-
In der Datenverarbeitung kommt eine Vielzahl von ments ist das Element.
Datenformaten zum Einsatz.
‚ Elemente enthalten in der Regel Text, können aber
auch anderen Inhalt haben.
L |  ‚ Wurzelelement: Ein xml Dokument hat immer ge-
nau ein Wurzelelement.
23.2.3 csv Datenformat
‚ element tags: Jedes Element besteht aus einem
Das csv Format ist ein Datenformat zum Austausch öffnenden- und schließenden Tag.
von Daten.
‚ Attribut: Neben Elementen können auch Attribute
Die Daten eines csv Datensatzes liegen getrennt definiert. Attribute beschreiben Elemente näher.
durch Trennzeichen vor.

 Codebeispiel: csv Format   Codebeispiel: xml Datenformat 


1 //------------------------------------------ 1 <!-- ----------------------------------- -->
2 // Datenformat: CSV 2 <!-- Datenformat: xml -->
3 //------------------------------------------ 3 <!-- ----------------------------------- -->
4 HTL Krems, 3aHIT, Brandstetter, Rene 4 <?xml version="1.0" encoding="UTF-8"?>
5 HTL Krems, 3aHIT, Hagmann, Dominik 5 <students>
6 HTL Krems, 3aHIT, Schandl, Lukas 6 <student id="9725248">
7 HTL Krems, 3aHIT, Steininger, Patrick 7 <first-name>John</first-name>
8 HTL Krems, 3aHIT, Ettenauer, Hannes 8 <last-name>Cenna</last-name>
9 HTL Krems, 3aHIT, Kalcher, Daniel 9 <student-code>9531267</student-code>
10 HTL Krems, 3aHIT, Fallmann, Lukas 10 <email>j.carterc@htlkrems.at</email>
11 HTL Krems, 3aHIT, Martin, Philipp 11 </student>
12 HTL Krems, 3aHIT, Vollmann, Lukas 12 <student id="9725249">
13 HTL Krems, 3aHIT, Gebharter, Nadine 13 <first-name>Dwayne</first-name>
14 HTL Krems, 3aHIT, Siegl, Bernhard 14 <last-name>Johnson</last-name>
15 HTL Krems, 3aHIT, Weissensteiner, Philipp 15 <student-code>9531227</student-code>
16 HTL Krems, 3aHIT, Haas, Julia 16 <email>d.johnson@htlkrems.at</email>
17 HTL Krems, 3aHIT, Resch, Sebastian 17 </student>
18 HTL Krems, 4aHIT, Haag, Sebastian 18 <student id="9725242">
19 HTL Krems, 4aHIT, Lauer, Christian Guenther 19 <first-name>Daniel</first-name>
20 HTL Krems, 4aHIT, Kauer, Alexander 20 <last-name>Bryan</last-name>
21 HTL Krems, 4aHIT, Aufmesser, Lukas 21 <student-code>9531267</student-code>
22 HTL Krems, 4aHIT, Hofbauer, Lukas 22 <email>d.bryan@htlkrems.at</email>
23 HTL Krems, 4aHIT, Armsdorfer, Dominique 23 </student>
24 HTL Krems, 4aHIT, Schrabauer, Michael 24 <student id="9725242">
25 HTL Krems, 4aHIT, Weidenauer, Martin 25 <first-name>Randy</first-name>
26 HTL Krems, 4aHIT, Reifenberger, Mika 26 <last-name>Orten</last-name>
27 HTL Krems, 4cHIT, Langhammer, Gregor 27 <email>r.orten@htlkrems.at</email>
28 HTL Krems, 4cHIT, Schuster, Alexander 28 </student>
29 HTL Krems, 4aHIT, Tuechler, Christina 29 </students>
30 HTL Krems, 4aHIT, Kletzl, Daniel

q
q

204
© Dipl.Ing.-Paul Panhofer Bsc.

23.2.5 Fallbeispiel: xml Dokument 23.2.6 json Datenformat

Als Fallbeispiel wollen wir uns die aus einer Schulver- JSON ist ein Datenformat das in erster Linie für
waltungssoftware exportierten Daten ansehen. den Datenaustausch zwischen Anwendungen verwen-
det wird.

L |   Erklärung: json Format 

 Beispiel: xml Dokument  ‚ Json basiert auf einer Untermenge der JavaScript
Datentypen.
1 <!-- ----------------------------------- -->
2 <!-- Datenformat: xml --> ‚ Ein Json Datensatz hat dabei 2 mögliche Struktu-
3 <!-- ----------------------------------- --> ren: Name/Werte Paare bzw. einer Liste von Wer-
4 <?xml version="1.0" encoding="UTF-8"?> ten.
5 <school id="tu-rew-32345">
6 <courses>
 Codebeispiel: json Format 
7 <course title="3aHIT" begin="Sep.2016">
8 <student> 1 //------------------------------------------
9 <first-name>Domnik</first-name> 2 // Datenformat: JSON
10 <last-name>Hagmann</last-name> 3 //------------------------------------------
11 </student> 4 var school = {
12 <student> 5 address : {
13 <first-name>Lukas</first-name> 6 postal-code : 3540,
14 <last-name>Schandl</last-name> 7 location : "Krems a. d. Donau",
15 </student> 8 street : "Allauntalstr. 29"
16 <student> 9 country : "Austria"
17 <first-name>Lukas</first-name> 10 },
18 <last-name>Schandl</last-name> 11 courses : [{
19 </student> 12 id : "tu-rew-32345",
20 <student> 13 begin :"Sep 2016",
21 <first-name>Patrick</first-name> 14 students : [{
22 <last-name>Huber</last-name> 15 first-name : "Rene",
23 </student> 16 last-name : "Brandstetter"
24 <student> 17 }, {
25 <first-name>Patrick</first-name> 18 first-name : "Lukas",
26 <last-name>Steiner</last-name> 19 last-name :"Schandl"
27 </student> 20 }, {
28 <student> 21 first-name : "Hannes",
29 <first-name>Patrick</first-name> 22 last-name : "Ettenauer"
30 <last-name>Schwarz</last-name> 23 }, {
31 </student> 24 first-name : "Diego",
32 <student> 25 last-name : "Traxler"
33 <first-name>Daniel</first-name> 26 }, {
34 <last-name>Kalcher</last-name> 27 first-name : "Markus",
35 </student> 28 last-name : "Schwaiger"
36 <student> 29 }, {
37 <first-name>Markus</first-name> 30 first-name : "Markus",
38 <last-name>Schwaiger</last-name> 31 last-name : "Schwaiger"
39 </student> 32 }
40 </course> 33 ]
41 </courses> 34 ]
42 </school> 35 }

q q

205
Informationssysteme

. .

206
Informationssysteme - Theorieskriptum
.

Datenformate
Version 2018.09.01
Informationssysteme

24. Datenformat - XML 24.1. XML Grundlagen 

L XML Datenformat 
XML ist ein grundlegendes Datenformat zur
Darstellung hierarchisch strukturierter Daten.

Hierarchisch strukturierte Daten bilden die


Welt in Form einer hierarchischen Baumstruk-
tur ab.

24.1.1 Einsatzgebiete von XML


XML ist ein Datenformat zur Darstellung hierar-
chisch strukturierter Daten.

 Auflistung: Einsatzgebiete von XML 

c Datenaustauschformat 
XML ist ein Datenformat zum Austausch von
01. XML Grundlagen 208
Daten zwischen Anwendungen und Software-
platformen.
02. XML Elemente 210
Neben JSON ist XML das wichtigste Datenaus-
03. XML Attribute 212 tauschformat für Informationssysteme.

04. Wohlgeformtheit 213


3 Anwendungskonfiguration 
05. Namensräume 214 In der Anwendungskonfiguration gilt XML als
de facto Standard für Informationssysteme.
06. Logische Sicht 216

 Auszeichnungssprache XML 
XML wurd mit der Motivation entwickelt eine
universale Auszeichnungssprache für das In-
ternet zu schaffen.

Eine Auszeichnungssprache definiert aus wel-


chen Elementen ein Dokument bestehen
kann. Die wohl bekannteste Auszeichnungs-
sprache ist HTML.

24.1.2 Fallbeispiel: XML Dokumente

XML wurd mit der Motivation entwickel eine universa-


le Auszeichnungssprache für das Internet zu schaffen.

208
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 59. Aufbau eines XML Dokuments

 Auflistung: Datenaustauschformate  24.1.3 Aufbau eines XML Dokuments


‚ proprietäre Formate: Der Handel unterstützt eine
Ein XML Dokument unterliegt einem durch die XML
Vielzahl eigener XML Sprachen für den Austausch Spezifikation vorgegebenem Aufbau.
von Daten zwischen Anwendungen.
‚ Officeanwendungen: Officeanwendungen spei-  Auflistung: Elemente eines XML Dokuments 
chern Dokumente in eigens dafür definierten
XML Formaten. L XML Deklaration 
‚ Grafikformate: Oft werden Grafikformate als Eine XML Datei unterteilt sich in die XML Dekla-
XML Sparchen definiert. SVG zählt dabei zu ration und den XML Datensatz.
den wichtigsten auf XML basierten Formaten.
Die XML Deklaration ist eine Erkennungszeich-
‚ SOAP Webservice: Webservice tauschen Daten oft nefolge am Beginn eines XML Dokuments. Sie
im XML Format aus. SOAP zählt dabei zu den am definiert die für das Dokuemnt verwendete
häufigsten verwendeten Formaten. Version der XML Spezifikation und den Typ der
Zeichenkodierung.
q

209
Informationssysteme

24.2. XML Elemente 


 XML Datensatz 
XML Elemente sind die grundlegenden Bausteine ei-
Der XML Datensatz enthält die Geschäftsda-
ten des XML Dokuments. Auf logischer Ebene nes XML Dokuments.
besteht er aus einem einzelnen XML Element -
dem Wurzelelement. 24.2.1 Struktur eines XML Dokuments

XML Elemente werden zur Speicherung und Struktu-


 XML Elemente  rierung der Daten eines XML Datensatzes verwendet.
XML Elemente sind die grundlegenden Bau-
Mit XML Elementen wird eine strikte Trennung von
steine eines XML Dokuments. XML Elemente
Daten und Strukturinformationen implementiert.
enthalten Teile der Geschäftsdaten.

 Erklärung: Xml Elemente 


ü XML Attribute  ‚ Ein XML Datensatz besteht immer aus einem XML
Mit XML Attributen könnnen XML Elemente nä- Element - dem Wurzelelement.
her beschrieben werden.
‚ Ein XML Element kann andere XML Elemente bzw.
Daten enthalten.
q
‚ Enthält ein XML Element andere XML Elemente so
können diese beliebig tief geschachtelt sein.

 Codebeispiel: Xml Dokument 


1 <!-- ----------------------------------- -->
2 <!-- Beispieldokument -->
3 <!-- ----------------------------------- -->
4 <?xml version="1.0" encoding="UTF-8"?>
5 <school>
6 <!-- Wurzelelement des Xml Dokuments -->
7 ...
8 </school>
9

10 <?xml version="1.0" encoding="UTF-8"?>


11 <school>
12 <classes>
13 <class id="3aHIT" year="2018">
14 <student id="181301">
15 <first-name>Karl</first-name>
16 <middle-name>Heinz</middle-name>
17 <last-name>Grasser</last-name>
18 </student>
19 <student id="181303">
20 <first-name>Franz</first-name>
21 <last-name>Hofer</last-name>
22 </student>
23 </class>
24 </classes>
25 </school>

210
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 60. Inhaltstypen von XML Elementen

24.2.2 Aufbau eines XML Elements 24.2.3 Inhaltstypen von XML Elementen

Ein XML Element besteht immer aus einem Start- und XML Elemente können andere XML Elemente bzw.
einem Endtag. Die Bezeichnung des Elements kann da- Daten enthalten.
bei beliebig sein.
 Auflistung: Inhaltstypen von Xml Elementen 
 Erklärung: Xml Element 
‚ Beispiel: <first-name>John< /first-name> Ô unstrukturierter Inhalt 

‚ Das XML Element besteht aus dem Start- Das XML Element enthält Daten in Form einer
tag <first-name> und dem dazugehörigen Endtag Zeichenkette. Der Inhaltstyp des XML Elements
</first-name>. wird als unstrukturiert eingestuft.

‚ Das Element speichert den Token John.

211
Informationssysteme

24.3. Attribute in Xml Elementen 


 strukturierter Inhalt 
Das XML Element enthält andere XML Elemen- Mit XML Attributen könnnen XML Elemente näher
te. Der Inhaltstyp des XML Elements wird als beschrieben werden.
strukturiert eingestuft.
24.3.1 Xml Attribute - Grundlagen
 gemischter Inhalt 
 Erklärung: Xml Attribute 
Das XML Element enthält Daten und XML Ele-
‚ Für ein XML Element können beliebig viele Attri-
mente. Der Inhaltstyp des XML Elements wird
ubte definiert werden.
als gemischt eingestuft.
‚ Die logische Struktur eines XML Attributs ent-
spricht einem Name/Werte Paar.
− leerer Inhalt 
‚ Ein XML Element kann nicht 2 Attribute mit dem
Das XML Element hat keinen Inhalt. Der Inhalt- gleichen Namen haben.
stype des XML Elements wird als leer einge-
stuft.
 Codebeispiel: XML Attribute 
1 <!-- ----------------------------------- -->
 Erklärung: Inhaltstypen  2 <!-- Attribute -->
‚ unstrukturierter Inhalt: Das XML Element enthält
3 <!-- ----------------------------------- -->
Daten in Form von Zeichenketten. 4 <?xml version="1.0" encoding="UTF-8"?>
5 <school>
1 <first-name>John</first-name> 6 <class id="3aHIT" semester="8">
7 <student id="181301">
‚ strukturierter Inhalt: Das XML Element enthält 8 <first-name>Karl</first-name>
andere XML Elemente. 9 <middle-name>Heinz</middle-name>
10 <last-name>Grasser</last-name>
1 <student id="1232345">
11 </student>
2 <first-name>John</first-name>
12 </class>
3 <middle>Fitzgerald Johansen</middle>
13 </school>
4 <last-name>Doe</last-name>
5 <phone>0650/443533</phone>
6 <email>j.doe@htlkrems.at</email> q
7 </student>

24.3.2 Vergleich: Elemente vs. Attribute


‚ gemischter Inhalt: Das XML Element enthält Da-
XML Elemente und XML Attribute sind die grundle-
ten und andere XML Elemente.
genden Artefakte eines XML Dokuments.
1 <name id="1232345">
2 Der Name des Schuelers ist  Analyse: Elemente vs. Attribute 
3 <first>John</first>, mit dem Nachnamen ‚ Attribute können Daten nur in Form von Zeichen-
4 <middle>Fitzgerald Johansen</middle> ketten speichern. XML Elemente differenzieren hin-
5 <last>Doe</last> gegen unterschiedliche Inhaltstypen.
6 <phone>0650/443533</phone>
7 <email>j.doe@htlkrems.at</email> ‚ Die Reihenfolge in der Attribute in einem XML Ele-
8 </name> menten auftreten sind belanglos. Die Reihenfolge in
der XML Elementen in einem XML Dokument auf-
treten ist signifikant.
‚ leerer Inhalt: Das XML Element hat keinen Inhalt.

1 <name/> ‚ Ein XML Attribut kann auch XML Element darge-


stellt werden.

q q

212
© Dipl.Ing.-Paul Panhofer Bsc.

24.4. Wohlgeformte XML Dokumente  24.4.3 Elementtags

Jedes Anfangstag muss ein zugehöriges Endetag ha-


Das XML Datenformat definiert eine Reihe von Regeln
ben.
für die Zusammensetzung eines XML Dokuments.
 Codebeispiel: Anfangstag und Endtag 
24.4.1 Wohlgeformete XML Dokumente 1 <!-- ----------------------------------- -->
2 <!-- Beispieldokument -->
 Auflistung: Wohlgeformete XML Elemente  3 <!-- ----------------------------------- -->
4 <?xml version="1.0"?>
 Wurzelelemnt  5 <student>
6 <name id="1232345" nickname="Shiny John">
Jedes XML Dokument besteht aus einem ein- 7 <first>John</first>
zelnen Wurzelelement. 8 <last>Silver</last>
9 </name>
c Wohlgeformete Elmente  10 <course>Informationssysteme</course>
11 </student>
Jedes Anfangstag muss ein zugehöriges End- 12
tag haben. 13

14 <!-- HTML folgt nicht der XML Syntax -->


15 <html>
í Elementstruktur 
16 <body>
XML Elemente dürfen sich nicht überlappen. 17 <p>Text
18 <br>More text in the same paragraph
q 19 <p>Some text in anoter paragraph</p>
20 </body>
24.4.2 Wurzelelement 21 </html>

Jedes XML Dokument hat genau ein Wurzelelement. q

 Codebeispiel: Wurzelelement 
1 <!-- ----------------------------------- --> 24.4.4 Überlappung von XML Elementen
2 <!-- Beispieldokument --> XML Elemente dürfen sich nicht überlappen.
3 <!-- ----------------------------------- -->
4 <!-- XML Dokument mit Wurzelelement -->  Codebeispiel: Überlappung von Elementen 
5 <?xml version="1.0"?> 1 <!-- ----------------------------------- -->
6 <name id="1232345" nickname="Shiny John"> 2 <!-- Beispieldokument -->
7 <first>John</first> 3 <!-- ----------------------------------- -->
8 <last>Doe</last> 4 <?xml version="1.0"?>
9 </name> 5 <name id="1232345" nickname="Shiny John">
10 6 <first>John</first>
11 <!-- XML Dokument ohne Wurzelelement --> 7 <last>Loke</last>
12 <?xml version="1.0"?> 8 </name>
13 <name id="1232345’ nickname=’Shiny John"> 9

14 <first>John</first> 10

15 <middle>Fitzgerald Johansen</middle> 11 <!-- HTML folgt nicht der XML Syntax -->
16 <last>Doe</last> 12 <html>
17 </name> 13 <body>
18 <name id="5672’ nickname=’Stinky Gordan"> 14 <p>Some <strong>formatted<em>text</strong>
19 <first>Gordan</first> 15 ,but </em> no grammer no good!
20 <last>Ramsey</last> 16 </body>
21 </name> 17 </html>

q
q

213
Informationssysteme

namespace Namensraum URL

xmlns:cr=http://www.htlkrems.ac.at/media-content/reverse/course
Präfix

24.5. XML Namensräume  24.5.2 XML Namensräume

 Erklärung: XML Namensräume 


L Xml Namensraum  ‚ Zur Auflösung von Namenskonflikten werden XML
Ein XML Namensraum ist ein logischer Na- Elemente in Namensräume zusammengefaßt.
mensraum mit dem XML Elemente einem lo- ‚ XML Namensräume zeigen die logische Zusammen-
gischen Kontext zugeordnet werden können. gehörigkeit von XML Elementen an.

Innerhalb eines Namensraums müssen die Namen ‚ Namensräume werden durch eine URI identifiziert.
von XML Elementen eindeutig sein. ‚ Jedem Element des Namensraums wird ein Bezeich-
ner vorangestellt um seine Zugehörigkeit zum Na-
 Analyse: Xml Namensraum  mensraum anzuzeigen.
‚ Das Konzept eines XMO Namensraumes kann mit
dem namespace von C# Klassen verglichen werden.  Codebeispiel: Namensräume 
1 <!-- ----------------------------------- -->
‚ Ein XML Namensraum ist ein logischer Namens-
2 <!-- Namensraum -->
raum mit dem XML Elemente einem logischen Kon-
3 <!-- ----------------------------------- -->
text zugeordnet werden können.
4 <?xml version="1.0"?>
q 5 <c:course xmlns:c="http://www.htl.at/courses">
6 <c:title>Semantic Web</c:title>
7 <c:description>
24.5.1 Namenskonflikte
8 Der Kurs Semantic Web behandelt die
Im folgenden Beispiel haben die beiden title Ele- 9 Prinzipien semistrukturierter Daten.
mente zwar denselben Namen, beschreiben aber un- 10 </c:description>
terschiedliche Konzepte. 11 <c:lecturers>
12 <l:lecturer>
Namensräume helfen XML Elemente mit gleichem
13 <l:name>
Namen aber unterschiedlicher Bedeutung zu diffe-
14 <l:title>Pirv.-Doz. Dr.</l:title>
renzieren.
15 <l:first>Steffen</l:first>
 Codebeispiel: XML Dokument  16 <l:last>Staab</l:last>
1 <!-- ----------------------------------- --> 17 </l:name>
2 <!-- Namensraum --> 18 </l:lecturer>
3 <!-- ----------------------------------- --> 19 <l:lecturer>
4 <?xml version="1.0"?> 20 <l:name>
5 <course> 21 <l:first>Gerald</l:first>
6 <title>Semantic Web</title> 22 <l:last>Futschek</l:last>
7 <description>Semantic ... </description> 23 </l:name>
8 <lecturers> 24 <l:contact>
9 <name> 25 <l:email>g.futsch@tuwien.at</l:email>
10 <title>Pirv.-Doz. Dr.</title> 26 <l:phone>0650/543467</l:phone>
11 <last>Staab</last> 27 </l:contact>
12 </name> 28 </l:lecturer>
13 </lecturers> 29 </c:lecturers>
14 </course> 30 </c:course>

q q

214
© Dipl.Ing.-Paul Panhofer Bsc.

24.5.3 Namensraumdefinition 24.5.4 Standard Namensraum

Namensraumdefinitionen müssen global eindeutig


sein. XML Namensräume werden aus diesem Grund L Standard Namensraum 
durch eine URI beschrieben. Der Standardnamensraum gilt für das Element
 Codebeispiel: Namensräume  indem er definiert wird, genauso wie für alle
Kindelemente dieses Elements.
1 <!-- ----------------------------------- -->
2 <!-- Namensraum -->
Für einen Standardnamensraum wird kein Prefix
3 <!-- ----------------------------------- -->
definiert.
4 <?xml version="1.0"?>
5 <c:course xmlns:c="http://www.htl.at/course">  Codebeispiel: Standard Namensräume 
6 <c:title>Semantic Web</c:title> 1 <!-- ----------------------------------- -->
7 <c:description> 2 <!-- Standard Namensraum -->
8 Der Kurs Semantic Web behandelt die 3 <!-- ----------------------------------- -->
9 semistrukturierter Daten. 4 <?xml version="1.0"?>
10 </c:description> 5 <c:course xmlns:c="http://www.htl.at/course">
11 <c:date>23.09.23 16:15:00</c:date> 6 <c:title>Semantic Web</c:title>
12 <loc:location 7 <c:description>
xmlns:loc="http://www.htl.at/location"> 8 Der Kurs Semantic Web behandelt die
13 <loc:country>Austria</loc:country> 9 semistrukturierter Daten.
14 <loc:city> 10 </c:description>
15 <loc:name>Vienna</loc:name> 11 <loc:location
16 <loc:code>1040</loc:code> xmlns:loc="http://www.htl.at/location">
17 </loc:city> 12 <loc:country>Austria</loc:country>
18 <loc:building>TU Vienna</loc:building> 13 </loc:location>
19 <loc:room>Seminarraum 134</loc:room> 14 <c:lecturers>
20 </loc:location> 15 <l:lecturer
21 <c:lecturers> xmlns:l="http://www.htl.at/lecturer">
22 <l:lecturer 16 <l:name>
xmlns:l="http://www.htl.at/lecturer"> 17 <l:title>Pirv.-Doz. Dr.</l:title>
23 <l:name> 18 <l:first>Steffen</l:first>
24 <l:title>Pirv.-Doz. Dr.</l:title> 19 <l:last>Staab</l:last>
25 <l:first>Steffen</l:first> 20 </l:name>
26 <l:last>Staab</l:last> 21 <l:contact>
27 </l:name> 22 <l:email>s.staab@hugo.com</l:email>
28 <l:contact> 23 </l:contact>
29 <l:email>s.staab@hugo.com</l:email> 24 </l:lecturer>
30 <l:phone>0650/543467</l:phone> 25 <l:lecturer
31 </l:contact> xmlns:l="http://www.htl.at/lecturer">
32 </l:lecturer> 26 <l:name>
33 <l:lecturer 27 <l:title>Pirv.-Doz. Dr.</l:title>
xmlns:l="http://www.htl.at/lecturer">28 <l:first>Steffen</l:first>
34 <l:name> 29 <l:last>Staab</l:last>
35 <l:title>Pirv.-Doz. Dr.</l:title> 30 </l:name>
36 <l:first>Steffen</l:first> 31 <l:contact>
37 <l:last>Staab</l:last> 32 <l:email>s.staab@hugo.com</l:email>
38 </l:name> 33 </l:contact>
39 </l:lecturer> 34 </l:lecturer>
40 </c:lecturers> 35 </c:lecturers>
41 </c:course> 36 </c:course>

q q

215
Informationssysteme

Abbildung 61. XML Technologien

24.6. Logische Sicht  24.6.2 XML Komponentenbaum

Bevor ein XML Dokument verarbeitet werden kann


XML wurd mit dem Anspruch entwickelt ein uni-
muß für das Dokument eine logische Sicht generiert
verselles Datenformat für das Internet zu schaffen.
werden.

24.6.1 XML Technologien L XML Komponentenbaum 

Zur Verarbeitung von XML Daten wurde eine Reihe Der logisch Aufbau eines XML Dokuments ent-
eigener Technologien definiert. spricht einer hierarchischen Baumstruktur. Die
Baumstruktur selbst wird als Komponenten-
 Auflistung: XML Technologien  baum bezeichnet.

‚ XML: Die XML Spezifikation definiert ein Daten- Damit existieren für XML Dokumente immer
format zum Austausch von Daten im Internet. 2 Sichten: die strukturelle- und die logische
Sicht.
‚ XML Schema: XML Schemas werden verwendet um
die Struktur für XML Dokumente zu definieren.
 Erklärung: XML Komponentenbaum 
‚ XPath: Die XPath Spezifikation beschreibt eine
Sprache zur Selektion von Knoten in XML Doku- ‚ Ein XML Komponentenbaum besteht aus Knoten.
menten. ‚ Der Aufbau eines Knotenbaums entspicht dabei der
‚ XSLT: XSLT ist eine XML Sprache zur Transfor- hierarchischen Struktur der strukturellen Sicht des
mation von XML Dokumenten. zugehörigen XML Dokuments. Für die unterschied-
lichen Elemente im XML Dokument werden im Kno-
‚ XQuery: XQuery ist eine Abfragesprache für XML tenbaum eigene Knoten integriert.
Datenbanken.
q
q

216
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 62. strukturelle vs. logische Sicht

24.6.3 Komponentenknoten 24.6.4 Knotentypen

Jedes XML Dokument besitzt eine Darstellung als Die XML Spezifikation definiert für die logische Sicht
Komponentenbaum. von XML Daten folgende Knotentypen.
 Erklärung: Komponentenknoten   Auflistung: Knotentypen 
‚ Jedes Element eines XML Dokuments besitzt eine
entsprechende Repräsentation als Knoten im Kno- K Wurzelknoten 
tenbaum.
Der Wurzelknoten ist der primäre Knoten eines
‚ Die XML Spezifikation definiert dabei für folgende Knotenbaums. Der Wurzelknoten enthält alle
Elementtypen eigene Knotentpyen: XML Deklara- anderen Knoten des Knotenbaums.
tion, Kommentare, XML Elemente, XML Attribue.
‚ Tritt eines dieser Elemente in einem XML Dokument  Elementknoten 
auf wird ein Knoten des entsprechenden Typs im
Elementknoten entsprechen der logischen
Knotenbaum eingefügt.
Repräsentation eines XML Elements.
‚ Elemente die in einem XML Element eingebettet
sind werden als Kindknoten des entsprechenden Ele-
mentknotens dargestellt. ü Attributknoten 

1 <!-- -------------------------------- --> Attributknoten entsprechen der logischen Re-


2 <!-- Knotenbaum --> präsentation eines XML Attributes. Der Attri-
3 <!-- -------------------------------- --> butknoten wird dem Elementknoten als Kind-
4 <class id="3aHIT" year="2018"> element zugeordnet.
5 <codes>AD-33</code>
6 </class>
n Textknoten 

Das <class> Element besitzt im Knotenbaum eine Die in einem Element enthaltenen Daten wer-
Repräsentation als Elementknoten. Dem Element- den einem eigenen Textknoten zugeordnet.
knoten sind dabei folgende Kindknoten zugeordnet: Der Textknoten wird dem entsprechendem
Ein Elementknoten für das <code> Element zusam- Elementknoten als Kindelement zugeordnet.
men mit 2 Attributknoten für die Attribute des Ele-
ments.
| Namensraumknoten 
‚ Beachten Sie das Knoten unterschiedlicher Knoten-
Der Namensraum eines Elements ist ihm als El-
typen Kindelemente eines Elementknoten sein kön-
ternknoten zugeordnet.
nen.

q q

217
Informationssysteme

25. Datenformat - XML XPath 25.1. XPath - Konzepte 

L XPath - Selektion 
XPath ist eine Adressierungssprache zur Aus-
wahl von Knoten in XML Dokumenten.

Der XPath Standard dient als Grundlage für eine


Reihe anderer XML Technologien wie XSLT, XML
Schema bzw. XQuery.

25.1.1 XPath Konzepte

Der Begriff XPath selbst ist ein Akronym. Die Abkür-


zung steht stellvertretend für den Ausdruck Xml Path
Language.

 Erklärung: XPath Grundlagen 


‚ XPath selbst ist keine XML Sprache. Der XPath
Standard definiert eine eigene Syntax zur Formulie-
rung von Pfadausdrücken.
01. XPath Konzepte 218
‚ Mit einem XPath Pfadausdruck kann die Position
02. Pfadausdrücke in Kurzform 219 von Knoten in einem XML Knotenbaum beschrieben
werden.
03. Lösungsobjekt 221
 Erklärung: Lokalisierungspfade 

04. Prädikate 221 ‚ Bevor ein XPath Ausdruck ausgewertet werden


kann, muss für die entsprechenden XML Daten die
05. Pfadausdrücke in Standardform 222 assozierte logische Sicht bestimmt werden. Lokali-
sierungspfade werden stets in Relation zum Kno-
06. XPath Funktionen 224 tenbaum eines XML Dokuments ausgewertet.

‚ Soll beispielsweise auf einen bestimmten Element-


07. Fallbeispiel: XPath 227 knoten eines XML Dokuments zugegriffen werden,
wird ein logischer Pfad ausgehend vom Wurzelkno-
ten des Knotenbaums zum gewünschten Element-
knoten definiert.

‚ Mit XPath Lokalisierungspfaden kann dabei auf be-


liebige Teile der XML Daten zugegriffen werden.

‚ Das Ergebnis der Auswertung eines Lokalisierungs-


pfades wird als Lösungsobjekt bezeichnet. Lö-
sungsobjekte können Knotenmengen, Strings, Zah-
len bzw. boolsche Werte sein.

‚ Die XPath Spezifikation unterscheidet für Lokalisie-


rungspfade 2 Formen: Pfadausdrücke in Standard-
schreibweise bzw. Pfadausdrücke in Kurzschreibwei-
se.

218
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 63. Knotenbaum eines XML Dokuments

25.2. Pfadausdrücke in Kurzform  25.2.2 Auswahl von Elementknoten

Der grundlegende Ausdruckstyp in XPath ist der Die Position von Elementknoten in XML Dokuemten
Lokalisierungspfad.
kann durch einfache XPath Pfadausdrücke beschrieben
werden.
 Erklärung: Knotenpfad 
25.2.1 Vereinfachte Pfadausdrücke
‚ Für die Auswahl von Elementknoten in XML Do-
Die XPath Spezifikation erlaubt für Lokalisierungspfa- kumenten wird ein logischer Pfad ausgehend vom
de eine vereinfachte Schreibweise: die XPath Kurz- Wurzelknoten des Knotenbaums zum gewünschten
form. Elementknoten definiert.

 Erklärung: XPath Kurzform  ‚ Jeder Lokalisierungsschritt des Pfadausdrucks ent-


spricht dabei einem der übergeordneten Element-
‚ Bei der Auswertung von Pfadausdrücken in Kurz-
knoten des gewünschten Elements.
form trifft die XPath Engine eine Reihe von An-
nahmen.
 Codebeispiel: Zugriff auf Elementknoten 
‚ Ihre kompakte Form schuldet die XPath Kurzform 1 // -----------------------------------------
dabei den getroffenen Annahmen, das Selektions- 2 // XPath: Pfadausdruecke
verhalten des entsprechenden Pfadausdrucks ist in 3 // -----------------------------------------
seiner Reichweite jedoch auf eine Zahl von Anwen- 4 // Selektion: Alle <student> Elemente
dungsfällen beschränkt. 5 // ergebnis: Alle im XML Dokument
6 // enthaltenen <student> Elemente
 Erklärung: Lokalisierungspfade  7

8 XPath: /school/classes/class/student
‚ Ein Lokalisierungspfad ist eine Folge von Lokalisie-
9
rungsstufen. Lokalisierungsstufen sind voneinander
10 // Selektion: Alle <school> Elemente
durch den / Delimiter getrennt.
11 // Ergebnis: Der <school> Wurzel-
‚ Je nach Knotentyp definiert die XPath Spezifikation 12 // elementknoten
einen eigenen Operatoren für die Knotenauswahl. 13

14 XPath: /school
1 // -----------------------------------------
15
2 // XPath: Lokalisierungspfade
16 // Selektion: Alle <schule> Elemente
3 // -----------------------------------------
17 // Loesung: In den XML Daten sind keine
4 // Selektion: <student> Elemente
18 // <schule> Elemente enthalten. Die
5 // Ergebnis: Alle xstudent> Elemente
19 // Loesungsmenge ist leer.
6
20
7 XPath: /school/classes/class/student
21 XPath: /schule

q
q

219
Informationssysteme

25.2.3 Kontextknoten 25.2.5 Auswahl von Textknoten

Textknoten werden im XML Knotenbaum als Kind-


L Kontextknoten  knoten von Elementknoten gespeichert.
Der Kontextknoten, ist jener Knoten eines
XML Dokuments, der zum gegenwärtigen Zeit-  Erklärung: Zugriff auf Textknoten 
punkt von der XPath Engine verarbeitet wird. ‚ Textknoten werden in XPath Lokalisierungspfaden
über den text() Operator ausgewählt.

 Erklärung: Kontextknoten  ‚ Das Lösungsobjekt der text() Knotenabfrage ist ei-


ne Zeichenkette.
‚ Zur Referenzierung des Kontextknotens wird der
Punktoperator verwendet.
 Codebeispiel: Zugriff auf Textknoten 
‚ Der Elternknoten des Kontextknotens kann über den 1 // -----------------------------------------
.. Operator ausgewählt werden. 2 // XPath: text() Knotentest
3 // -----------------------------------------
 Codebeispiel: Punktoperatoren  4 //Selektion: Alle Vornamen der Schueler
1 // ----------------------------------------- 5 //Loesungsobjekt: String
2 // XPath: Kontextoperatoren 6 XPath: //student/first-name/text()
3 // -----------------------------------------
4 // Selektion: Alle <first-name> Kindelemente
q
5 // des Kontextknotens
6 // Loesungsobjekt: Knotenmenge
7 XPath: ./first-name 25.2.6 Auswahl von Attributknoten
8

9 // Selektion: Alle <first-name> Kindelemente Obwohl die XPath Spezifikation, Elementknoten als
10 // des Elternknotens des Kontextknotens Elternknoten ihrer Attributknoten definiert, können
11 // Lsungsobjekt: Knotenmenge Attributknoten nicht als Kindknoten eines Element-
12 XPath: ../name knotens angesprochen werden.

 Erklärung: Zugriff auf Attribute 


q
‚ Für den Zugriff auf die Attributknoten eines Ele-
mentknotens wird der @ Operator verwendet.
25.2.4 Descendant Pfadoperator
‚ Das Ergebnis der Auswertung des @ Operators ist
Der Descendant Pfadoperator ermöglicht einen Kno- eine Knotenmenge von Attributknoten.
tendurchlauf über alle Nachkommen des Kontextkno- ‚ Mit der Kombination des @ und des * Operators
tens. kann auf alle Attributknoten eines Elements zuge-
 Codebeispiel: Doppelte Pfadoperator  griffen werden.
1 // -----------------------------------------
 Codebeispiel: Zugriff auf Attribute 
2 // XPath: Descendant Pfadoperator
1 // -----------------------------------------
3 // -----------------------------------------
2 // XPath: @ Operator
4 // Selektion: alle Vorkommen des <first-name>
3 // -----------------------------------------
5 // Elements im XML Dokument
4 // Selektion: die id Attribute aller Schueler
6 XPath: //first-name
5 // Loesungsobjekt: Knotenmenge
7
6 XPath: //student/@id
8 // Selektion: alle <first-name> Elemente
7
9 // die Kindelemente eines <student>
8 // Selektion: alle Attribute der Schueler
10 // Elements im XML Dokument
9 // Loesungsobjekt: Knotenmenge
11 XPath: //student/first-name
10 XPath: //student/@*

q
q

220
© Dipl.Ing.-Paul Panhofer Bsc.

25.3. Lösungsobjekt  25.4. Prädikat 

Das Ergebnis eines XPath Ausdrucks ist ein Lö- Zur Filterung der Knoten einer Knotenmenge kön-
sungsobjekt. nen Prädikate definiert werden.

25.4.1 Definieren von Prädikaten


25.3.1 Lösungsobjekt - Datentypen

Die XPath Spezifikation definiert 4 Typen von Lö- L XPath Prädikat 


sungsobjekten.
Ein Prädikat ist ein logischer Ausdruck.
 Auflistung: Datentypen für Lösungsobjekte 

 Knotenmenge   Erklärung: Filtern mit Prädikaten 


‚ Prädikate werden in eckigen Klammern, am Ende ei-
Eine Knotenmenge ist eine Teilmengen der ner Lokalisierungsstufe definiert. Die eckigen Klam-
Knoten eines Knotenbaums. mern sind dabei ein Steuerzeichen der XPath En-
gine.
g String  ‚ Für eine XPath Lokalisierungsstufe kann eine belie-
Ein String ist eine Zeichenfolge. Die Zeichenfol- bige Zahl von Prädikaten definiert werden.
ge kann dabei auch leer sein. ‚ Werden für einen XPath Ausdruck mehrere Prädi-
kate definiert, werde die Prädikate ausgehend vom
z.B.: ’Hallo Welt’
ersten Prädikat zum letzten hin ausgewertet.
‚ Prädikatsausdrücke unterstützen die folgenden Ver-
 Number  gleichsoperatoren : <, >, >= , <=, =, !=.
Number Objekte sind 64 Bit Fließkommazah- ‚ Allerdings muß beachtet werden, dass Operatoren
len. wie <, > nicht unmittelbar in einem XML Doku-
z.B.: 34 ment erscheinen dürfen, sondern durch die entspre-
chenden Entitätsreferenzen &lt; bzw. &gt; ersetzt
werden müssen.
¤ Boolean 
 Codebeispiel: Prädikate 
Boolean Objekte nehmen entweder den Wert
true oder false an. 1 // -----------------------------------------
2 // Praedikate
3 // -----------------------------------------
 Codebeispiel: Datentypen  4 // Alle Projekte mit einer bestimmten id
1 // ----------------------------------------- 5 /projects[@id=’343225’]
2 // XPath: Loesungsobjekte 6

3 // ----------------------------------------- 7 // Alle Personen die ein name Element haben


4 // Loesungsobjekt: Knotenmenge 8 //person[name]
5 XPath: //student 9

6 10 // Alle subprojecte die einen Partner haben


7 // Loesungsobjekt: String 11 /project[partners/partner]/subprojects/
8 XPath: //student/first-name/text() 12 subproject
9 13

10 // Loesungsobjekt: Number 14 // Die 3te Person einer Knotenmenge


11 XPath: count(//person) 15 //person[3]
12 16

13 // Loesungsobjekt: Boolean 17 // Alle Personen die eine id haben


14 XPath: boolean(/project/title) 18 //person[@id]

q q

221
Informationssysteme

Achse Knotenabfrage Prädikat


/child::project/descendant::subproject[attribute::id=’34256632676-3235-23’]
Lokalisierungsstufe Lokalisierungsstufe

25.5. Pfadausdrücke in Standardform  25.5.2 Achsenbezeichner

Die XPath Spezifikation unterscheidet 2 Formen von Achsenbezeichner definieren die Richtung eines Kno-
Lokalisierungspfaden: Lokalisierungspfade in Stan- tendurchlaufs in Lokalisierungsstufen.
dardschreibweise bzw. Lokalisierungspfade in Kurz-
form.
L | 
Ein Lokalisierungspfad ist eine Folge von Lokalisie-
rungsstufen.  Erklärung: Achsenbezeichner 
‚ Jede Lokalisierungsstufe besteht aus einem Ach-
25.5.1 Lokalisierungsstufen senbezeichner, einer Knotenabfrage und gegebenfalls
aus Prädikaten.
Eine Lokalisierungsstufe besteht aus 3 möglichen Seg-
menten.
‚ Der Achsennamen bestimmt die Richtung, in die der
Lokalisierungspfad fortgesetzt werden soll.
 Syntax: Lokalisierungsstufe 
1 // -----------------------------------------
‚ Das Ergebnis eines Knotendurchlaufs enthält alle
Knoten der gewählten Achse relativ zum Kontext-
2 // XPath: Syntax Lokalisierungsstufe
knoten.
3 // -----------------------------------------
4 Achse::Knotenabfrage[Pradikat1][...]  Auflistung: Achsen 
‚ self: Die Achse referenziert den Kontextknoten.
 Auflistung: Segmente einer Lokalisierungsstufe 
‚ child: Die Achse referenziert alle Kindknoten des
 Achsenbezeichner  Kontextknotens.

Der Achsenbezeichner definiert die Richtung ‚ parent: Die Achse referenziert den Elternknoten des

des Knotendurchlaufs einer Lokalisierungsstu- Kontextknotens.


fe. Das Ergebnis eines Knotendurchlaufs ist ei- ‚ descendant: Die Achse referenziert alle Nachkom-
ne Knotenmenge . men des Kontextknotens (Kinder, Kindeskinder
etc.).
Die Angabe eines Achsenbezeichners ist ver-
pflichtend. ‚ ancestor: Die Achse referenziert alle Vorfahren des
Kontextkontens inc. des Wurzelknotens.

n Knotenabfrage  ‚ following: Die Achse referenziert alle Nachkommen


des Kontextknotens in Dokumentreihenfolge.
Die Knotenabfrage ermöglicht eine Voraus-
wahl der durch den Knotendurcklauf be- ‚ following-silbing: Die Achse referenziert alle nach-
stimmten Knoten. folgenden Geschwister des Kontextknotens.

Die Angabe einer Knotenabfrage ist verpflich- ‚ preceding-silbing: Die Achse referenziert alle vor-
tend. hergehenden Geschwister des Kontextknotens.
‚ preceding: Die Achse referenziert alle vorhergehen-

ü Prädikat  den Knoten des Kontextknotens in Dokumentrei-


henfolge.
Prädikate erlauben die Formulierung komple-
xer Filterbedingungen. ‚ attribute: Die Achse referenziert alle Attributkno-
ten des Kontextknotens.

q q

222
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 64. Achsen in XPath

25.5.3 Knotenabfragen  Codebeispiel: Knotenabfrage 


1 // -----------------------------------------
Mit einer Knotenabfrage werden die Knoten eines Kno-
2 // XPath: Knotenabfrage
tendurchlaufs gefiltert.
3 // -----------------------------------------
 Erklärung: Knotenabfrage  4 // Selektion: Alle Elementknoten im Knoten-
‚ Die Knotenabfrage selbst wird an den Achsenbe- 5 // durchlauf
zeichner angehängt und ermöglicht eine Voraus- 6 // Knotentesttyp: Knotentypentest
wahl, der durch den Knotendurchlauf bestimmten 7 XPath: child::*
Knoten. 8

9 // Selektion: Alle <student> Elementknoten


‚ Die Knotenabfrage besteht dabei entweder aus ei- 10 // im Knotendurchlauf
nem Elementvergleich bzw. dem Test auf einen be- 11 // Knotentesttyp: Elementvergleich
stimmten Knotentypen. 12 XPath: parent::student
‚ Ein Elementvergleich wählt alle Knoten des Knoten- 13

durchlaufs aus, die einen bestimmten Namen habne. 14 // Selektion: Alle Textknoten im Knoten-
15 // durchlaufs
‚ Knotentypentests ermöglichen eine Vorauswahl al- 16 // Knotentesttyp: Knotentypentest
le Knoten des Knotendurchlaufs die eine bestimm- 17 XPath: ancestor::text()
ten Knotentpynen habne. Die XPath Spezifikation 18
definiert für Knotentypentests eine Reihe von Ope- 19 // Selektion: Alle Knoten des KD.
ratoren und Funktionen. 20 // Knotentesttyp: Knotentypentest
‚ Zur Formulierung komplexer Filterbedingungen 21 XPath: descendant::node()
können Prädikate10 für XPath Lokalisierungsstufen 22

definiert werden. 23 // Selektion: Alle Kommentarknoten


24 // Knotentesttyp: Knotentypentest
25 XPath: parent::comment()

10 q
siehe Kapitel Prädikate

223
Informationssysteme

25.5.4 Formen von XPath Ausdrücken 25.6. XPath Funktionen 


Für Lokalisierungsstufen unterscheidet die XPath Spe- Die XPath Spezifikation umfasst eine Reihe von
zifikation 2 Formen: die Standardschreibweise bzw. Funktionen zur Bearbeitung von XPath Aus-
Lokalisierungsstufen in Kurzform. drücken.

L |  25.6.1 Kategorien von Funktionen


 Vergleich: Kurz- vs. Standardform  XPath Funktionen werden einer von 4 Kategorien zu-
‚ Lokalisierungspfade können als Mischform der Stan- geordnet.
dardschreibweise bzw. der Kurzform definiert wer-  Auflistung: Kategorien von Fuktionen 
den.

‚ Beachten Sie das jede Lokalisierungsstufe in Kurz-  Knotenmengenfunktionen: 


form in einen equivalenten XPath Ausdruck in
Knotenmengenfunktionen werden zur Verar-
Standardform übergeführt werden kann. Der Um-
beitung von Mengen von Knoten eingesetzt.
kehrschluß gilt jedoch nicht.

 Codebeispiel: Transformationsregeln  g String Funktionen: 


1 // ----------------------------------------- String Funktionen werden zur Verarbeitung
2 // XPath: Standardform vs. Kurzform von Zeichenketten eingesetzt.
3 // -----------------------------------------
4 // Pfadausdruecke
5 Kurzform: classes/class  Numerische Funktionen: 
6 Standardform: child::classes/child::class
Numerische Funktionen werden zur Verarbei-
7
tung von Zahlenwerten verwendet.
8 // Attributknoten
9 KF: //student/@id
10 SF: /descendant::student/attribute::id ¤ Logische Funktionen: 
11 Mischform: //student/attribute::id
12 Logische Funktionen werden zur Verarbeitung
13 KF: //student/@* von boolschen Ausdrücke verwendet.
14 SF: /descendant::student/attribute::node()
15 MF: /descendant::student/@* q
16

17 // Kontextknoten 25.6.2 Knotenmengenfunktionen


18 KF: .
19 SF: self::node()  Auflistung: Knotenmengenfunktionen 
20
‚ last(), count(): Ermittel die Anzahl von Knoten ei-
21 //Elternknoten
ner Knotenmenge.
22 KF: ..
23 SF: parent::node() ‚ position(): Ermittelt die Position eines Knotens in
24 einer Knotenmenge.
25 // Textknoten
‚ local-name(): Ermittelt den lokalen Namen eines
26 KF: //first-name/text()
Knotens.
27 SF: /descendant::first-name/child::text()
28 MF: //first-name/child::text() ‚ namespace-uri(): Ermittelt die Namensraumes URI
29 eines Knotens.
30 KF: //last-name/text()
‚ name(): Ermittelt den qualifizierten Namen eines
31 SF: /descendant::last-name/child::text()
Knotens.

224
© Dipl.Ing.-Paul Panhofer Bsc.

 Codebeispiel: Knotenmengenfunktionen   Codebeispiel: Stringfunktionen 


1 // ----------------------------------------- 1 // -----------------------------------------
2 // XPath Funktion: last 2 // XPath Funktion: string
3 // ----------------------------------------- 3 // -----------------------------------------
4 /project/subprojects/subproject[last()] 4 /* xs:string string(
5 5 items elem
6 /* Ermittelt das letzten subproject Element 6 ) */
7 der Knotenmenge */ 7

8 8 XPath: string(/project[@id=’343225’]/name)
9 // ----------------------------------------- 9 Ergebnis: ’Simulation’
10 // XPath Funktion: count 10

11 // ----------------------------------------- 11 XPath: string(/project/@id)


12 count(/project/subprojects/subproject) 12 Ergebnis: ’343225’
13 13

14 /* Ermittelt die Anzahl von Subprojekte in der 14 XPath: string(2 = 2)


15 Knotenmenge */ 15 Ergebnis: ’true’
16

17 // -----------------------------------------
q
18 // XPath Funktion: concat
19 // -----------------------------------------
25.6.3 String Funktionen 20 /* xs:string concat(
21 xs:anyAtomicType* token
 Auflistung: String Funktionen  22 ) */
23
‚ string(): Ermittelt die Stringdarstellung der über-
24 XPath: concat(’a’, ’b’, ’c’)
gebenen Knotenmenge.
25 Ergebnis: ’abc’
‚ concat(): Verkettet die übergebenen Zeichenket- 26

ten. 27 XPath: concat(


28 /person[last()]/first-name,
‚ starts-with(): Gibt den Wert wahr, zurück wenn die
29 ’ ’,
erste Zeichenkette mit der zweiten Zeichenkette be-
30 /person[last()]/middle_name
ginnt.
31 ’ ’,
‚ contains(): Gibt den Wert wahr zurück, wenn die 32 /person[last()]/last-name,
zweite Zeichenkette in der ersten Zeichenkette ent- 33 )
halten ist. 34

35 Ergebnis: Stefan Jell


‚ substring-before(): Liefert aus der ersten Zeichen-
36
kette ds, was vor dem Teil steht, der mit der zweiten
37 // -----------------------------------------
Zeichenkette übereinstimmt.
38 // XPath Funktion: starts-with
‚ substring-after(): Liefert aus der ersten Zeichenket- 39 // -----------------------------------------
te das, was hinter dem Teil steht, der mit dem ers- 40 /* xs:boolean starts-with(
ten Auftreten der zweiten Zeichenketten überein- 41 xs:string token1, xs:string token2
stimmt. 42 )*/
43
‚ substring(): Liefert eine Teil einer Zeichenkette, der
44 XPath: starts-with(’yes’, ’yes’)
an der mit dem zweiten Argument angegebenen Po-
45 Ergebnis: true
sition beginnt und die mit dem dritten Argument
46
angegeben Länge hat.
47 XPath: starts-with(/person[last()]/name, ’J’)
‚ string-length(): Liefert die Anzahl der Zeichen in 48 Ergebnis: true
einer Zeichenkette.
q

225
Informationssysteme

 Codebeispiel: Stringfunktionen  25.6.4 Logische Funktionen


1 // -----------------------------------------
Logische Funktionen werden zur Verarbeitung bool-
2 // XPath Funktion: string-length
scher Ausdrücke verwendet.
3 // -----------------------------------------
4 /* xs:integer string-length(
 Auflistung: Logische Funktionen 
5 xs:string token
6 ) */ ‚ boolean(): Wandelt das angegebene Objekt in
7
einen logischen Wert um. Nichtleere Kontenmengen,
8 XPath: string-length(’abc’) nichtleere String-Werte und Zahlen größer 0 ergeben
9 Ergebnis: 3 wahr.
10 ‚ not(): Ergibt wahr, wenn das Objekt falsch ist.
11 // -----------------------------------------
12 // XPath Funktion: contains ‚ true(): Gibt immer den Wert wahr zurück.
13 // ----------------------------------------- ‚ false(): Gibt immer den Wert falsch zurück.
14 /* xs:boolean contains(
15 xs:string param1,
 Codebeispiel: Logische Fuktionen 
16 xs:string param2
1 // -----------------------------------------
17 ) */
2 // XPath Funktion: boolean
18
3 // -----------------------------------------
19 XPath: contains(’Shakespeare’, ’spear’)
4 /* xs:boolean boolean(
20 Ergebnis: true
5 items()
21
6 ) */
22 XPath: contains(’Shakespeare’, ’’)
7
23 Ergebnis: true
8 XPath: boolean(/project[@id=’1’])
24
9 Ergebnis: false
25 XPath: contains(’’, ’Shakespeare’)
10
26 Ergebnis: false
11 XPath: boolean(/project[@id=’343225’])
27
12 Ergebnis: true
28 XPath: contains(/person[last()]/name, ’J’)
13
29 Ergebnis: true
14 XPath: boolean(string(/project/name))
30
15 Ergebnis: true
31 // -----------------------------------------
16
32 // XPath Funktion: substring
17 // -----------------------------------------
33 // -----------------------------------------
18 // XPath Funktion: not
34 /* xs:string substring(
19 // -----------------------------------------
35 xs:string param1,
20 /* xs:boolean not(
36 xs:double param2,
21 item()
37 xs:double param3
22 ) */
38 ) */
23
39
24 XPath: not(1 = 1)
40 XPath: substring(’abcde’, 2)
25 Ergebnis: false
41 Ergebnis: ’bcde’
26
42
27 XPath: not(*)
43 XPath: substring(’abcde’, 2, 2)
28 wahr wenn der Kontextknoten keine
44 Ergebnis: ’bc’
29 Kindelemente hat
45
30
46 XPath: substring(’abcde’, 10, 2)
31 XPath: not(name=’AI’)
47 Ergebnis: ’’
32 wahr wenn der Kontextknoten eine name
48
33 Element hat mit dem Wert AI
49 XPath: substring(’abcde’, 1, 20)

q
q

226
© Dipl.Ing.-Paul Panhofer Bsc.

25.7. Fallbeispiel: XPath  25.7.2 XPath Ausdrücke

Aufgabenstellung XPath Ausdrücke:


Schreiben Sie für folgende Aufgabenstellung die gefrag-
ten XPath Ausdrücke.
 Codebeispiel: Lokalisierungspfade 
1 // -----------------------------------------
25.7.1 Datei: browser.xml 2 // Beispieldokument: browser.xml
3 // -----------------------------------------
 Codebeispiel: Eingabedatein  4 1. Finden Sie alle <subpage> Elemente
1 <!-- ---------------------------------- --> 5

2 <!-- Beispieldokument: browser.xml --> 6 /browser/subpage


3 <!-- ---------------------------------- --> 7

4 <?xml version="1.0" encoding="UTF-8"?> 8 // -----------------------------------------


5 <browser> 9 2. Finden sie das letzte <subpage> Element
6 <tab id="t1" > 10 des t1 <tab>
7 <link url="http://www.orf.at"/> 11 // -----------------------------------------
8 <content> 12

9 Berichterstattung 13 /browser/tab[@id=’t1’]/subpage[last()]
10 </content> 14

11 <subpage id="s1" topic="wheater"> 15 // -----------------------------------------


12 <link url="wheater"/> 16 3. Finden Sie alle <subpage> Elemente die
13 <content> 17 nicht in der <history> enthalten sind
14 Das Wetter fuer Oesterreich 18 // -----------------------------------------
15 </content> 19

16 </subpage> 20 //subpage[not(@id = //history/sub/text())]


17 <subpage id="s2" topic="sport"> 21

18 <link url="sport"/> 22 // -----------------------------------------


19 <content> 23 4. Geben Sie die gesamte url der s1
20 Unglaubliche Sportnachrichten 24 <subpage> an
21 </content> 25 // -----------------------------------------
22 </subpage> 26

23 <sublink id="s3" topic="society"/> 27 concat(//tab[@id=’t1’]/link/@url, ’/’,


24 </tab> 28 //tab[@id=’t1’]/subpage[@id=’s1’]/link/@url)
25 <tab id="t2"> 29

26 <link url="http://www.wrd.de/reisen"/> 30 // -----------------------------------------


27 <content> 31 5. Geben Sie das erste <tab> aus das sich mit
28 Reiseberichte mit Tamia Karens 32 der Berichterstattung befasst.
29 </content> 33 // -----------------------------------------
30 <subpage id="s5"> 34

31 <link url="train"/> 35 //tab[contains(content,


32 <content> ’Berichterstattung’)][1]
33 Zugreisen in Europa 36

34 </content> 37 // -----------------------------------------
35 </subpage> 38 6. Wie oft wurde <subpage> s5 vom User auf-
36 </tab> 39 gerufen
37 <histor> 40 // -----------------------------------------
38 <sub>s1</sub> 41 count(//sub[.=’s5’])
39 <sub>s3</sub> 42

40 <sub>s5</sub> 43 count(/descendant::sub[self::node()=’s5’])
41 </history>
42 </browser>
q

227
Informationssysteme

26. Datenformat - XML XSLT 26.1. XSLT Grundlagen 

L XSLT Standard 
Der XSLT Standard ist eine XML Sprache zur
Transformation und Verarbeitung von XML Do-
kumenten.

Ein XSLT Programm beschreibt Regeln zur Trans-


formation von XML Daten.

26.1.1 XSLT Stylesheet

Ein XSLT Programm wird als XSLT Stylesheet be-


zeichnet.

 Erklärung: XSLT Stylesheet 


‚ Ein XSLT Stylesheet selbst ist ein XML Dokument.

‚ Ein Stylesheet besteht dabei aus einer freien Abfolge


von Templateregeln.
01. XSLT Grundlagen 228
‚ Templateregeln beschreiben wie die Elemente eines
XML Eingabedokuments verarbeitet werden sollen.
02. XSLT Transformationsprocess 229

 Codebeispiel: XSLT Stylesheet 


03. XSLT Programm 230
1 <!-- ----------------------------------- -->
2 <!-- XSLT Stylesheet -->
04. Deklarative Verarbeitung 232
3 <!-- ----------------------------------- -->
4 <?xml version="1.0" encoding="UTF-8"?>
05. Prozedurale Verarbeitung 234 5 <xsl:stylesheet
xmlns:xsl="http://www.w3.org/Transform">
06. Ausgabestream 237 6

7 <xsl:template match="...">
07. Suchanfragen 239 8

9 ...
10 </xsl:template>
11

12 <xsl:template match="...">
13

14 ...
15 </xsl:template>
16

17 <xsl:template match="...">
18

19 ...
20 </xsl:template>
21

22 </xsl:stylesheet>

228
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 65. Transformation von XML Dokumenten

26.1.2 Fallbeispiel: Hello World 26.2. XSLT Transformationsprozess 

 Codebeispiel: Hello World  Der XSLT Transformationsprozess besteht aus einer


1 <!-- ----------------------------------- --> Folge von Schritten.
2 <!-- Input: greeting.xml -->
3 <!-- ----------------------------------- -->
4 <?xml version="1.0"?> 26.2.1 Transformationsschritte
5 <greeting>
6 Hello, World!  Auflistung: Transformationsschritte 
7 </greeting>
8
r Intialisierungsschritt 
9 <!-- ----------------------------------- --> Die XSLT Engine lädt die XML Eingabedatei
10 <!-- XSLT Programm: greeting.xsl --> und das gewünschte Stylesheet.
11 <!-- ----------------------------------- -->
12 <?xml version="1.0" encoding="UTF-8"?>
13 <xsl:stylesheet  Logische Verarbeitung 
14 xmlns:xsl="http://www.w3.org/Transform"
Die XSLT Engine generiert für die eingelesenen
15 version="2.0">
XML Daten eine Knotenbaumrepräsentation.
16

17 <xsl:template match="greeting">
18 <html> L Kontextschritt 
19 <body>
Um Knoten verarbeiten zu können müssen sie
20 <h1>
in den Knotext der XSLT Enginen geladen wer-
21 <xsl:value-of select="greeting"/>
den. Es gibt 2 Möglichkeiten um Knoten in den
22 </h1>
Kontext zu laden:
23 </body>
24 </html> ‚ Mit dem Abschluss der logischen Verarbei-
25 </xsl:template> tung wird der Wurzelknoten der XML Einga-
26 bedatei in den Kontext geladen.
27 </xsl:stylesheet>
28
‚ Durch den Aufruf der apply-templates An-
weisung können neue Knoten in den Kon-
29 <!-- ----------------------------------- -->
text geladen werden.
30 <!-- Output: greeting.html -->
31 <!-- ----------------------------------- -->
32 <html>
3 Verarbeitungsschritt 
33 <body>
34 <h1>Hello, World!</h1> Für jeden Knoten im Kontext bestimmt die
35 </body> XSLT Engine eine entsprechende Templatere-
36 </html> gel, um den Knoten zu verarbeiten.

q q

229
Informationssysteme

26.3. XSLT Programm  26.3.2 Templateregel

Templateregeln sind die grundlegenden Bausteine ei-


26.3.1 XSLT Stylesheet nes XSLT Stylesheets.
 Erklärung: Templateregel 
L XSLT Stylesheet  ‚ Templateregeln werden zur Verarbeitung von XML
Knoten verwendet.
Ein XSLT Programm wird als XSLT Stylesheet be-
zeichnet. ‚ Eine Templateregel bezieht sich dabei immer auf ein
bestimmtes XML Element der eingelesenen XML
Eingabedaten.
 Erklärung: XSLT Stylesheet 
‚ Ein XSLT Stylesheet selbst ist ein XML Dokument. ‚ Templateregel setzten sich aus 2 Teilen zusammen:
dem XSLT Suchmuster und dem Template.
‚ Ein Stylesheet definiert eine freie Abfolge von Tem-
plateregeln. Templateregeln beschreiben wie die  Auflistung: Komponenten einer Templateregel 
Elemente einer XML Eingabedatei verarbeitet wer-
den sollen. ü XSLT Suchmuster 
‚ Templateregeln werden in XSLT mit dem Suchmuster sind XPath Lokalisierungspfade.
<xsl:template> Element definiert. Suchmuster definieren welche Elementknoten
einer Eingabedatei, mit einer Templateregel
 Codebeispiel: XSLT Stylesheet  verarbeitet werden können.
1 <!-- ----------------------------------- -->
2 <!-- XSLT Stylesheet --> 3 Template 
3 <!-- ----------------------------------- -->
4 <?xml version="1.0" encoding="UTF-8"?> Ein Template definiert eine freie Abfolge von
5 <xsl:stylesheet Anweisungen. Im XSLT Template wird der
xmlns:xsl="http://www.w3.org/Transform" eigentliche Transformationsprozess beschrie-
version="2.0"> ben.
6
q
7 <xsl:template match="...">
8
26.3.3 XSLT Suchmuster
9 ...
10 <xsl:apply-template select="..."/> Ein XSLT Suchmuster wird durch einen XPath Loka-
11 </xsl:template> lisierungspfad beschrieben.
12

13  Erklärung: XSLT Suchmuster 


14 <xsl:template match="..."> ‚ Suchmuster werden im match Attribut eines
15 <xsl:template> Elements definiert.
16 ...
‚ Mit einem Suchmuster wird bestimmt, welche Ele-
17 <xsl:apply-template select="..."/>
mentknoten der Eingabedatei, mit einer Template-
18 </xsl:template>
regel verarbeitet werden sollen.
19

20 ‚ Damit definiert ein Suchmuster eine Relation zwi-


21 <xsl:template match="..."> schen den Templateregeln des XSLT Stylesheets und
22 den XML Elementen der XML Eingabedatei.
23 ... ‚ Für den Knotendurchlauf im XSLT Suchmuster
24 <xsl:apply-template select="..."/> kann nur auf die child bzw descendand Achse zu-
25 </xsl:template> rückgegriffen werden.
26

27 </xsl:stylesheet> ‚ Im match Attribut können auch mehrere Lokalisie-


rungspfade getrennt durch ein | definiert werden.

q q

230
© Dipl.Ing.-Paul Panhofer Bsc.

Abbildung 66. XSLT Transformationsprozess

26.3.4 Template Anweisungen  Codebeispiel: Template 


1 <!-- ----------------------------------- -->
Templates enthalten Anweisungen zur Verarbei-
2 <!-- Input: greeting.xml -->
tung von XML Daten. 3 <!-- ----------------------------------- -->
4 <?xml version="1.0"?>
Templates können 2 Arten von Anweisungen11 enthal- 5 <greeting>
ten: XSLT Anweisungen und Literale. 6 Hello, World!
7 </greeting>
 Auflistung: Template Anweisungen  8

9 <!-- ----------------------------------- -->


3 XSLT Anweisungen  10 <!-- xslt file: greeting.xsl -->
11 <!-- ----------------------------------- -->
XSLT Anweisungen sind Befehle die vom XSLT
12 <?xml version="1.0" encoding="UTF-8"?>
Prozessor ausgeführt werden. XSLT Anweisun-
13 <xsl:stylesheet
gen sind im Stylesheet am xsl Namespace er-
14 xmlns:xsl="http://www.w3.org/Transform"
kennbar.
15 version="2.0">
16

L Literale  17 <xsl:output method="xml" indent="yes"/>


18
Literale werden vom XSLT Prozessor nicht verar-
19 <xsl:template match="/">
beitet. Literale werden direkt in den Ausgabe-
20 <html>
strom des Transformationsprozesses geschrie-
21 <body>
ben.
22 <xsl:apply-templates select="/"/>
23 </body>
24 </html>
 Analyse: Template Anweisungen 
25 </xsl:template>
‚ XSLT Anweisungen: Das folgende Beispiel ent- 26
hält die folgenden XSLT Anweisungen: stylesheet, 27 <xsl:template match="greeting">
output, template, apply-templates und value-of. 28 <h1>
‚ Literale: Die restlichen Anweisungen sind Litera- 29 <xsl:value-of select="greeting"/>
le. Literale werden direkt in den Ausgabestrom des 30 </h1>
Transformationsprozesses geschrieben. 31 </xsl:template>
32

33 </xsl:stylesheet>

11
Befehl q

231
Informationssysteme

26.4. Deklarative Verarbeitung  26.4.2 <xsl:template> Element

Ein XSLT Stylesheet ist eine freie Abfolge von Tem-


plateregeln.
3 XSLT Tranformationsprozess 
 Erklärung: Templateregeln 
Der XSLT Transformationsprozess besteht im
wesentlichen aus 2 sich wiederholenden ‚ Templateregeln werden in XSLT mit dem
Schritten: <xsl:template> Element definiert.

‚ 1.Schritt: Schreibe die zu verarbeitenden


‚ Stellt die XSLT Engine für einen Knoten im XSLT
Kontexts eine Übereinstimmung mit dem Suchmus-
Elemente in den Kontext der XSLT Engine
ter einer Templateregel fest, wird die entsprechende
‚ 2.Schritt: Verabeite die Elemente des Kon- Templateregel geladen, um den Knoten zu verarbei-
text mit Templateregeln. ten.
‚ Die Templateregel selbst hat nun Zugriff auf alle Da-
ten des Knotens zusammen mit allen Parametern die
26.4.1 <xsl:apply-templates> Element im <xsl:apply-templates> Element definiert wor-
den sind.
Mit der apply-templates Anweisung werden neue
XML Elemente in den Kontext der XSLT Engine ge-  Syntax: <xsl:template> 
schrieben.
1 <!-- ----------------------------------- -->
 Erklärung: apply-templates Anweisung  2 <!-- Syntax: <xsl:template> -->
‚ Mit der apply-templates Anweisung wird gesteu- 3 <!-- ----------------------------------- -->
ert, welche Elemente der Eingabedatei in den Kon- 4 <xsl:template
text geschrieben werden sollen. 5 match = Knotenmengenausdruck
6 mode = Zeichenkette>
‚ Die apply-templates Anweisung wird zur Steue- 7 </xsl:template>
rung des Transformationsprozesses verwendet. 8

9 <!-- ----------------------------------- -->


 Syntax: <xsl:apply-templates>  10 <!-- XSLT: param Anweisung -->
1 <!-- ----------------------------------- --> 11 <!-- ----------------------------------- -->
2 <!-- Syntax: <xsl:apply-templates> --> 12 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- ----------------------------------- --> 13 <xsl:stylesheet
4 <xsl:apply-templates xmlns:xsl="http://www.w3.org/Transform">
5 select = Knotenmengenausdruck 14

6 mode = QName> 15 <xsl:template match="...">


7 </xsl:apply-templates> 16 ...
8 17 <!-- bind parameter to element -->
9 <!-- ----------------------------------- --> 18 <xsl:apply-templates select="..."/>
10 <!-- XSLT: apply-templates Anweisung --> 19 <xsl:with-param name="type">
11 <!-- ----------------------------------- --> 20 action
12 <?xml version="1.0" encoding="UTF-8"?> 21 </xsl:with-param>
13 <xsl:stylesheet 22 </xsl:apply-templates>
xmlns:xsl="http://www.w3.org/Transform"> 23 </xsl:template>
14 24

15 <xsl:template match="..."> 25 <!-- Declare template parameter -->


16 <xsl:apply-template select="..."/> 26 <xsl:template match="...">
17 </xsl:template> 27 <xsl:param name="type"/>
18 28 </xsl:template>
19 </xsl:stylesheet> 29

30 </xsl:stylesheet>

q
q

232
© Dipl.Ing.-Paul Panhofer Bsc.

26.4.3 <xsl:with-param> Element 26.4.4 xsl:mode Attribut

Mit der with-param Anweisung können zusätzliche In- XSLT Stylesheets können mehrere Templateregeln
formationen mit den Knoten im Kontext der XSLT En- mit demselben XSLT Suchmustern enthalten.
gine definiert werden.
Templateregeln mit dem gleichen Suchmuster sind
für die XSLT Engine nicht differenzierbar.
 Erklärung: with-param Anweisung 
‚ Durch das einbetten der with-param Anweisung in
 Erklärung: Modaler Aufruf 
<xsl:apply-templates> Elementen können zusätz-
liche Informationen mit Elementen im Knotext as- ‚ Der XSLT Prozessor unterscheidet Templateregeln
soziert werden. durch den Vergleich ihrer Suchmuster.

‚ Bei der Verarbeitung dieser Elements, hat die ent-


‚ Besitzen 2 oder mehrere Templateregeln dasselbe
Suchmuster versucht die XSLT Engine die Templa-
sprechende Templateregel nun Zugriff auf die mit
tes durch den Vergeleich der mode Attribute zu dif-
der with-param Anweisung definierten Parameter.
ferenzieren.

 Syntax: <xsl:with-param>  ‚ Das xsl:mode Attribut muß dabei sowohl für


1 <!-- ----------------------------------- --> das <xsl:apply-templates> Element als auch dem
2 <!-- Syntax: <xsl:with-param> --> <xsl:template> Element gesetzt sein.
3 <!-- ----------------------------------- -->
4 <xsl:with-param name = QName  Codebeispiel: Template modi 
5 select = Knotenmengenausdruck> 1 <!-- ----------------------------------- -->
6 </xsl:with-param> 2 <!-- XSLT: Template Modi -->
7 3 <!-- ----------------------------------- -->
8 <!-- ----------------------------------- --> 4 <?xml version="1.0" encoding="UTF-8" ?>
9 <!-- XSLT: with-param --> 5 <xsl:stylesheet
10 <!-- ----------------------------------- --> xmlns:xsl="http://www.w3.org/Transform">
11 <?xml version="1.0" encoding="UTF-8"?> 6

12 <xsl:stylesheet 7 <xsl:template match="/">


xmlns:xsl="http://www.w3.org/Transform"> 8 <!-- Verarbeitung durch Template A -->
13 9 <xsl:apply-templates
14 <xsl:template match="..."> select="//movie[1]"
15 ... mode="premiere"/>
16 <!-- bind parameter to element --> 10

17 <xsl:apply-templates select="..."/> 11 <!-- Verarbeitung durch Template B -->


18 <xsl:with-param name="type"> 12 <xsl:apply-templates select="//movie"/>
19 action 13 </xsl:template>
20 </xsl:with-param> 14

21 </xsl:apply-templates> 15 <!-- Template A -->


22 </xsl:template> 16 <xsl:template match="movie"
23 mode="premiere">
24 <xsl:template match="..."> 17 ...
25 <!-- fetch value from context --> 18 </xsl:template>
26 <!-- and bind it to param --> 19

27 <xsl:param name="type"/> 20 <!-- Template B -->


28 21 <xsl:template match="movie">
29 <!-- work with value --> 22 ...
30 <xsl:value-of select="$type"/> 23 </xsl:template>
31 </xsl:template> 24

32 25

33 </xsl:stylesheet> 26 </xsl:stylesheet>

q q

233
Informationssysteme

26.5. Prozedurale Verarbeitung  26.5.2 <xsl:value-of> Element

Mit der value-of Anweisung kann die Stringdarstel-


Die XSLT Spezifikation definiert eine Reihe von
lung von Variablen, Parametern bzw. Knoten ermittelt
Anweisungen zur prozeduralen Verarbeitung von
werden.
XML Knoten.
 Syntax: <xsl:value-of> 
26.5.1 <xsl:variable> Element 1 <!-- ----------------------------------- -->
2 <!-- Syntax: <xsl:value-of> -->
Für die Verarbeitung von Knoten unterstützt XSLT 3 <!-- ----------------------------------- -->
die Verwendung von Variablen. 4 <xsl:value-of select = Ausdruck
5 disable-output-escaping = "yes" | "no"
 Erklärung: Variablendeklaration  6 </xsl:value-of>
‚ Die XSLT Spezifikation definiert Variablen jedoch 7

nur in einem sehr eingeschränkten Sinn. 8 <!-- ----------------------------------- -->


‚ XSLT Variablen kann zwar ein Wert zugewiesen 9 <!-- XSLT: value-of Anweisung -->
werden, der Wert der Variable kann im Laufe der 10 <!-- ----------------------------------- -->
weiteren Verarbeitung jedoch nicht geändert wer- 11 <?xml version="1.0" encoding="UTF-8"?>
den. 12 <xsl:stylesheet version="2.0">
13
‚ Der Geltungsbereich einer Variable beschränkt sich 14 <xsl:template match="...">
dabei auf die Templateregel, indem sie definiert wur- 15 <xsl:value-of select="@id"/>
de. 16 ...
 Syntax: <xsl:variable>  17 <xsl:variable name="code"
select="’java’"/>
1 <!-- ----------------------------------- -->
18
2 <!-- Syntax: <xsl:variable> -->
19 <!-- Stringdarstellung -->
3 <!-- ----------------------------------- -->
20 <xsl:value-of select="$code"/>
4 <xsl:variable name = QName select = Ausdruck>
21 </xsl:template>
5 <!-- Inhalt: Template -->
22
6 </xsl:variable>
23 </xsl:stylesheet>
7

8 <!-- ----------------------------------- -->


9 <!-- XSLT: variable Anweisung --> q
10 <!-- ----------------------------------- -->
11 <?xml version="1.0" encoding="UTF-8" ?>
26.5.3 <xsl:if> Element
12 <xsl:stylesheet version="2.0">
13 Die if Anweisung ermöglicht den Ablauf der Verarbei-
14 <xsl:template match="..."> tung von Anweisungen innerhalb einer Templateregel
15 <!-- Deklaration und Initialisierung --> zu steuern.
16 <xsl:varialble name="a" select="’cm’"/>
17
 Erklärung: if Anweisung 
18 <!-- Zugriff auf den Wert der Varia. --> ‚ Zur Formulierung von Bedingung wird dem im
19 <xsl:value-of select="$a"/> <xsl:if> Element definiertem test Attribut ein lo-
20 gischer Ausdruck zugeordnet.
21 <!-- Deklaration und Initialisierung -->
‚ Kann der logische Ausdruck zu true evaluiert wer-
22 <xsl:variable name="b">
den, werden die im <xsl:if> Element enthaltenen
23 <xsl:value-of select="..."/>
Anweisungen ausgeführt.
24 </xsl:variable>
25 </xsl:template> ‚ Für Logische Ausdrücke gelten dabei dieselben syn-
26 taktischen Einschränkungen wie für Prädikate in
27 </xsl:stylesheet> XPath Ausdrücken.

234
© Dipl.Ing.-Paul Panhofer Bsc.

 Erklärung: Auswertung logischer Ausdrücke  26.5.4 <xsl:choose> Element


‚ Number: Die numerischen Werte 0 bzw. NaN eva-
Neben dem <xsl:if> Element definiert die XSLT Spe-
luieren zu false. Alle anderen Werte evaluieren zu zifikation das <xsl:choose> Element zur Steuerung
true. des Programmflusses.
‚ node-set: Leere node-set evaluieren zu false.
node-set mit Elementen evaluieren zu true.  Erklärung: choose Anweisung 

‚ String: Ein leerer String evaluiert zu false. Alle


‚ Im <xsl:choose> XML Element können mehrere
<xsl:when> Elemente eingebettet werden.
anderen Strings evaluieren zu true.
‚ Evaluiert der im test Attribut einer when Anwei-
 Syntax: <xsl:if>  sung definierte logische Ausdruck zu true, werden
1 <!-- ----------------------------------- --> die in der Anweisung engebetteten Elemente ausge-
2 <!-- Syntax: <xsl:if> --> führt.
3 <!-- ----------------------------------- --> ‚ Es wird jedoch nur die erste when Anweisung ausge-
4 <xsl:if test = logischer Ausdruck> führt, deren Bedingung zu true evaluiert.
5 <!-- Inhalt: Template -->
6 </xsl:if> ‚ Zusätzlich kann mit dem <xsl:otherwise> Element
7
ein Default Pfad definiert. Trifft keine der angegeben
8 <!-- ----------------------------------- --> Bedingungen zu verzweigt der Programmfluss in den
9 <!-- XSLT: if Anweisung --> Defaultzweig.
10 <!-- ----------------------------------- -->
 Syntax: <xsl:choose> 
11 <?xml version="1.0" encoding="UTF-8"?>
1 <!-- ----------------------------------- -->
12 <xsl:stylesheet version="2.0">
2 <!-- Syntax: <xsl:choose> -->
13
3 <!-- ----------------------------------- -->
14 <xsl:template match="...">
4 <xsl:choose>
15 <xsl:variable name="code"
5 <xsl:when test = logischer Ausdruck>
select="’java’"/>
6 <!-- Inhalt: Template -->
16
7 </xsl:when>
17 <xsl:variable name="students"
8 <xsl:otherwise>
select="/students"/>
9 <!-- Inhalt: Template -->
18
10 </xsl:otherwise>
19 <!-- Vergleich von Zeichenketten -->
11 </xsl:choose>
20 <xsl:if test="@id = $code">
12
21 ...
13 <!-- ----------------------------------- -->
22 </xsl:if>
14 <!-- XSLT: choose Anweisung -->
23
15 <!-- ----------------------------------- -->
24 <!-- Test auf Knotenmengen -->
16 <xsl:template match="table-row">
25 <xsl:if test="$students">
17 <xsl:choose>
26 ...
18 <xsl:when test="position() = 0">
27 </xsl:if>
19 <xsl:text>papaywhip</xsl:text>
28
20 </xsl:when>
29 <!-- Vergleich von Zahlenwerten -->
21 <xsl:when test="position() = 1">
30 <xsl:if test="">
22 <xsl:text>mintcream</xsl:text>
31
23 </xsl:when>
32 </xsl:if>
24 <xsl:otherwise>
33
25 <xsl:text>whitesmoke</xsl:text>
34 </xsl:template>
26 </xsl:otherwise>
35
27 </xsl:choose>
36 </xsl:stylesheet>
28 </xsl:template>

q
q

235
Informationssysteme

26.5.5 <xsl:for-each> Element 26.5.6 <xsl:sort> Element

Zur Verarbeitung von Knotenmengen stellt die XSLT Mit dem <xsl:sort> Element können die Knoten einer
Spezifikation das <xsl:for-each> Element zur Verfü- Knotemenge sortiert werden.
gung.
 Erklärung: Sortieren von Knotenmengen 
 Erklärung: Iterative Verarbeitung 
‚ Das <xsl:sort> Element kann dabei als Kin-
‚ Für die iterative Verarbeitung eines node-sets delement des <xsl:apply-templates> bzw. des
stellt XSLT das <xsl:for-each> Element zur Ver- <xsl:for-each> Elements auftretten.
fügung.
‚ Um eine Knotenmenge nach mehreren Kriterien zu
‚ In jedem Iterationsschritt der Schleife wird eines sortieren, wird das <xsl:sort> Element wiederholt
der Elemente des node-sets verarbeitet. eingebettet.
‚ Das <xsl:for-each> Element ist dabei neben dem  Syntax: <xsl:sort> 
<xsl:apply-templates> Element die einzige Anwei- 1 <!-- ----------------------------------- -->
sung, die den Kontext des XSLT Prozessors verän- 2 <!-- Syntax: <xsl:sort> -->
dern kann. 3 <!-- ----------------------------------- -->
4 <xsl:sort
 Codebeispiel: for-each Anweisung 
5 select = Knotenmenge
1 <!-- ----------------------------------- -->
6 order = "ascending" | "descending"
2 <!-- XSLT: for-each Anweisung -->
7 </xsl:sort>
3 <!-- ----------------------------------- -->
8
4 <?xml version="1.0" encoding="UTF-8"?>
9 <!-- ----------------------------------- -->
5 <xsl:stylesheet version="2.0">
10 <!-- XSLT: sort Anweisung -->
6
11 <!-- ----------------------------------- -->
7 <!-- Datenformat der Ausgabe -->
12 <?xml version="1.0" encoding="UTF-8"?>
8 <xsl:output method="html"/>
13 <xsl:stylesheet version="2.0">
9
14
10 <xsl:template match="/">
15 <!-- Datenformat der Ausgabe -->
11 <cinema>
16 <xsl:output method="html"/>
12 <!-- iterative Verarbeitung -->
17
13 <xsl:for-each
18 <xsl:template match="/">
select="movies/movie">
19 <project-staff>
14 <xsl:if test="imdbRating[.
20 <xsl:for-each select="//employee">
&gt; 8]">
21 <xsl:sort
15 <screening>
select="name/last-name"
16 <title>
order="descending"/>
17 <xsl:value-of
22 <xsl:sort
select="title"/>
select="name/first-name"
18 </title>
order="descending"/>
19 <link>
23
20 <xsl:value-of
24 <last-name>
select="@url"/>
25 <xsl:value-of
21 </link>
select="name/last-name"/>
22 </screening>
26 </last-name>
23 </xsl:if>
27 <first-name>unknown</first-name>
24 </xsl:for-each>
28 </xsl:for-each>
25 </cinema>
29 </project-staff>
26 </xsl:template>
30 </xsl:template>
27
31
28 </xsl:stylesheet>
32 </xsl:stylesheet>

q q

236
© Dipl.Ing.-Paul Panhofer Bsc.

26.6. Ausgabestream  26.6.2 <xsl:text> Element

Die text Anweisung wird verwendet um Textzeichen


Die XSLT Spezifikation definiert eine Reihe von An-
in den Ausgabestream zu schreiben.
weisungen zum Schreiben von Daten in den Ausga-
bestream.  Syntax: <xsl:text> 
1 <!-- ----------------------------------- -->
26.6.1 <xsl:element> Element 2 <!-- Syntax: <xsl:text> -->
3 <!-- ----------------------------------- -->
Die element Anweisung wird verwendet um ein XML
4 <xsl:text
Element in den Ausgabestream zu schreiben.
5 disable-output-escaping = "yes" |
 Syntax: <xsl:element>  "no">
1 <!-- ----------------------------------- --> 6 <!-- Inhalt: PCDATA -->
2 <!-- Syntax: <xsl:element> --> 7 </xsl:text>
3 <!-- ----------------------------------- -->
4 <xsl:element q
5 name = QName
6 namespace = URI Referenz 26.6.3 <xsl:attribute> Element
7 use-attribute-set = QName>
8 <!-- Inhalt: Template --> Die attribute Anweisung wird verwendet um Attri-
9 </xsl:element> bute in den Ausgabestream zu schreiben.
10
 Erklärung: attribute Anweisung 
11 <!-- ----------------------------------- -->
12 <!-- XSLT: element Anweisung --> ‚ In ein <xsl:element> Element können mehrere
13 <!-- ----------------------------------- --> <xsl:attribute> Elemente eingebettet werden.
14 <?xml version="1.0" encoding="UTF-8" ?> ‚ Beim Generieren des Ausgabestroms wird ein ent-
15 <xsl:stylesheet version="2.0"> sprechendes Attribut dem übergeordneten XML Ele-
16
ment hinzugefügt.
17 <xsl:template match="/">
18 <kursprogramm>  Syntax: <xsl:attribute> 
19 <xsl:apply-templates select="kurs"/> 1 <!-- ----------------------------------- -->
20 </kursprogramm> 2 <!-- Syntax: <xsl:attribute> -->
21 </xsl:template> 3 <!-- ----------------------------------- -->
22 4 <xsl:attribute
23 <xsl:template match="kurs"> 5 name = QName
24 <kurs> 6 namespace = URI Referenz>
25 <xsl:for-each select="@*"> 7 <!-- Inhalt: Template -->
26 <xsl:element name="{name()}"> 8 </xsl:attribute>
27 <xsl:value-of select="."/> 9

28 </xsl:element> 10 <!-- ----------------------------------- -->


29 </xsl:for-each> 11 <!-- XSLT: attribute Anweisung -->
30 </kurs> 12 <!-- ----------------------------------- -->
31 </xsl:template> 13 <xsl:stylesheet version="2.0">
32 14 <xsl:template match="kurs">
33 <xsl:template match="..."> 15 <kurs>
34 ... 16 <xsl:attribute name="nr">
35 17 <xsl:value-of select="position()"/>
36 18 </xsl:attribute>
37 </xsl:template> 19 </kurs>
38 20 </xsl:template>
39 </xsl:stylesheet> 21 </xsl:stylesheet>

q q

237
Informationssysteme

26.6.4 <xsl:attribute-set> Element 26.6.5 <xsl:copy-of> Element

Teilen sich mehrere Elemente dieselben Attribute kann Die <xsl:copy-of> Anweisung kopiert die durch einen
eine gemeinsame Attributliste für die entsprechenden XPath Ausdruck definierte Knotenmenge in die Aus-
Elemente definiert werden. gabedatei.
 Syntax: <xsl:copy-of> 
 Erklärung: attribute-set