Inhaltsverzeichnis | 6 |
Vorwort | 13 |
1. Einführung | 20 |
1. 1. Beispieldatenbank | 20 |
1. 1. 1. Entitäten | 20 |
1. 1. 2. Szenario | 21 |
1. 1. 3. Tabellen und Beziehungen | 25 |
1. 2. Einrichtung der Umgebung | 27 |
1. 2. 1. Oracle Database 10g Express Edition | 27 |
1. 2. 2. Entwicklungsumgebung | 31 |
1. 2. 2. 1 Oracle SQL Developer | 31 |
1. 2. 2. 2 Oracle SQL Developer Data Modeler | 33 |
1. 3. Einrichtung der Beispiel-Datenbank | 34 |
1. 3. 1. Dateien | 34 |
1. 3. 2. Tabellen und Daten aufspielen | 35 |
2. Einführung in PL/SQL | 39 |
2. 1. Wozu überhaupt PL/SQL? | 39 |
2. 1. 1. SQL- und PL/SQL-Variante eines Datenzugriffs | 39 |
2. 1. 2. Architektur von PL/SQL-Anwendungen | 42 |
2. 2. Die Struktur von PL/SQL | 46 |
2. 2. 1. Schreibweise und Benennungskonventionen für Variablen | 46 |
2. 2. 2. Blockstruktur | 48 |
2. 2. 3. Einsatzbereiche von PL/SQL | 50 |
2. 2. 4. Guter Programmierstil: Kommentare und Formatierungen | 52 |
3. Grundlegende Syntaxvorstellung | 58 |
3. 1. Basis-Syntax | 58 |
3. 1. 1. Gültige Zeichenmenge | 58 |
3. 1. 2. Literale | 59 |
3. 1. 2. 1 Literale: Anführungszeichen | 60 |
3. 1. 2. 2 Literale: Boolesche Werte | 61 |
3. 1. 2. 3 Literale: Zahlen | 62 |
3. 2. Variablen | 63 |
3. 2. 1. Deklaration | 64 |
3. 2. 2. Verwendung von %TYPE | 65 |
3. 2. 3. Vererbung von Datentypen | 66 |
3. 2. 4. Gültigkeit und Sichtbarkeit | 66 |
3. 3. Datentypen und Operatoren | 70 |
3. 3. 1. Oracle- und PL/SQL-Datentypen | 71 |
3. 3. 2. Subtypen – Eigene Datentypen | 73 |
3. 3. 3. Automatische und explizite Typumwandlung | 75 |
3. 3. 4. Operatoren | 79 |
3. 4. Ausgabemöglichkeiten im Puffer und in Dateien | 82 |
3. 4. 1. Puffer-Ausgaben mit DBMS_OUTPUT | 82 |
3. 4. 2. Datei-Ausgaben mit UTL_FILE | 87 |
3. 4. 2. 1 Einrichten eines Verzeichnisses | 88 |
3. 4. 2. 2 In Dateien schreiben und aus Dateien lesen | 90 |
3. 4. 3. Ausnahmen des UTL_FILE-Pakets | 95 |
3. 4. 4. Textformatierungen und Ersetzungen | 96 |
3. 5. Verzweigungen | 99 |
3. 5. 1. IF-Verzweigung | 100 |
3. 5. 2. IF-ELSE-Verzweigung | 101 |
3. 5. 3. IF-ELSIF-ELSE-Verzweigung | 102 |
3. 5. 4. CASE mit einzelnem Selektor | 103 |
3. 5. 5. Ausnahmen bei CASE | 104 |
3. 5. 6. Selektorlose CASE-Anweisung | 105 |
3. 5. 7. Programmmuster bei Verzweigungen | 106 |
3. 6. Schleifen | 107 |
3. 6. 1. LOOP – Einfache Schleife | 107 |
3. 6. 2. Schleifensteuerung mit EXIT und CONTINUE | 108 |
3. 6. 3. Verschachtelte Schleifenkonstruktionen mit Labeln | 109 |
3. 6. 4. WHILE-Schleife | 111 |
3. 6. 5. Numerische FOR-Schleife | 113 |
3. 7. Weitere Anweisungen | 115 |
3. 7. 1. GOTO-Strukturen mit Labeln | 115 |
3. 7. 1. 1 Beispiel | 116 |
3. 7. 1. 2 Nutzung mit Schaltvariablen | 119 |
3. 7. 2. NULL im Anweisungsabschnitt | 123 |
3. 8. Datensätze und %RECORD | 124 |
3. 9. Vorteile bei der Verwendung | 125 |
3. 9. 1. Definition eines Datensatztyps | 126 |
3. 9. 2. Verwendung von Datensätzen | 128 |
3. 9. 3. Datensatz-Erzeugung mit %ROWTYPE | 131 |
4. Transaktionssteuerung | 134 |
4. 1. SQL in PL/SQL | 134 |
4. 1. 1. Zulässigkeit von Anweisungen | 134 |
4. 1. 2. Dynamisches SQL | 135 |
4. 2. Kontextwechsel | 137 |
4. 2. 1. Grundprinzip | 138 |
4. 2. 2. Zugriffe über DB-Links | 141 |
4. 2. 3. Einsatz von Synonymen | 142 |
4. 2. 4. Aufruf von Pseudospalten | 143 |
4. 3. Steuerung von Transaktionen | 148 |
4. 3. 1. Grundproblem | 148 |
4. 3. 2. Bestätigen und zurücksetzen von Anweisungen | 150 |
4. 3. 3. Sicherungspunkte | 154 |
4. 3. 4. Transaktionen festlegen | 158 |
4. 3. 5. Tabellen sperren | 160 |
5. Cursor und Mengen | 164 |
5. 1. Prinzip von Cursorn | 164 |
5. 1. 1. Erzeugen und verarbeiten | 164 |
5. 1. 2. Cursor-Operationen | 166 |
5. 2. Explizite Cursor | 167 |
5. 2. 1. Deklaration | 167 |
5. 2. 2. Verarbeitung | 169 |
5. 2. 3. Cursor-Schleifen und Cursor-Attribute | 173 |
5. 2. 4. Parametrisierte Cursor und Wertzuweisungen | 178 |
5. 3. Implizite Cursor | 180 |
5. 3. 1. Definition | 180 |
5. 3. 2. Attribute | 182 |
5. 3. 3. Beispiel | 183 |
5. 3. 4. Zeilensperren im Cursor | 185 |
5. 4. Cursor-Variablen | 187 |
5. 4. 1. Deklaration | 187 |
5. 4. 2. Verarbeitung | 189 |
5. 5. Weitere Techniken | 194 |
5. 5. 1. Cursor-Ausdrücke | 194 |
5. 5. 2. Cursor-Ausnahmen | 197 |
6. Fehler und Ausnahmen | 199 |
6. 1. Einführung | 199 |
6. 1. 1. Typologie von Ausnahmen | 199 |
6. 1. 2. Allgemeine Funktionsweise von Ausnahmen | 200 |
6. 1. 3. Vordefinierte Ausnahmen | 203 |
6. 2. Selbst definierte Ausnahmen | 205 |
6. 2. 1. Deklaration und Verwendung | 205 |
6. 2. 2. Fehlermeldungen und Fehlerwerte | 207 |
6. 2. 3. Fehler und Ausnahmen in verschachtelten Blöcken | 210 |
6. 2. 4. Verschachtelte Blöcke und besondere Ausnahmen | 213 |
6. 2. 5. Verwendung von Ausnahmen bei Schleifen und Blöcken | 216 |
7. Collections und ihre Verarbeitung | 222 |
7. 1. Collections | 222 |
7. 1. 1. Typen | 222 |
7. 1. 2. Assoziative Arrays (Index-By-Tabellen) | 223 |
7. 1. 3. Verschachtelte Tabellen (Nested Tables) | 226 |
7. 1. 4. Varrays | 229 |
7. 1. 5. Multidimensionale Strukturen | 230 |
7. 1. 6. Collection-Methoden | 240 |
7. 1. 7. Ausnahmen und Collections | 247 |
7. 2. Mengenbindung und Mengenverarbeitung | 247 |
7. 2. 1. Bindungstypen | 248 |
7. 2. 2. Leistungsunterschiede im Vergleich | 249 |
7. 2. 3. Mengenübertragung mit FORALL | 250 |
7. 2. 4. Verwendung von Cursor-Attributen | 253 |
7. 2. 5. Ausnahmebehandlung bei der Mengenbindung | 256 |
7. 2. 6. Mengenabfrage mit BULK COLLECT | 259 |
7. 2. 7. Einsatz von RETURNING | 263 |
8. Dynamisches SQL | 268 |
8. 1. Einführung | 268 |
8. 1. 1. Grundproblem | 268 |
8. 1. 2. Verwendungszweck und Einsatzbereiche | 270 |
8. 2. SQL-Befehle mit EXECUTE IMMEDIATE ausführen | 270 |
8. 2. 1. Allgemeine Syntax | 271 |
8. 2. 2. Beispiel | 272 |
8. 3. Dynamisches SQL im Kontext | 279 |
8. 3. 1. Verwendung von Cursor-Variablen | 279 |
8. 3. 2. Mengenverarbeitung | 282 |
8. 3. 3. Beispiele | 284 |
9. Prozeduren und Funktionen | 290 |
9. 1. Modulare Strukturen in PL/SQL | 290 |
9. 1. 1. Typen von Modulen in PL/SQL | 290 |
9. 1. 2. Parameter und Parameter-Modi | 293 |
9. 1. 3. Fehlersuche und Korrektur | 300 |
9. 1. 3. 1 Data-Dictionary-Abfragen | 305 |
9. 1. 3. 2 Data-Dictionary-Sichten | 305 |
9. 2. Funktionen und Prozeduren erstellen | 307 |
9. 2. 1. Allgemeine Syntax für Funktionen | 307 |
9. 2. 2. Blockstruktur von Funktionen | 309 |
9. 2. 3. Entscheidungen für Parameter-Modi | 314 |
9. 2. 4. Ausnahmebehandlung | 318 |
9. 2. 5. Übergabe von Werten bei IN und IN OUT | 321 |
9. 2. 6. Rückgaben mit RETURN | 323 |
9. 2. 6. 1 Gültige Rückgabewerte bzw. -ausdrücke | 323 |
9. 2. 6. 2 Mehrere Rückgabewerte durch Fallunterscheidungen | 325 |
9. 2. 6. 3 Mehrere Rückgabewerte als fehlerhafte Deklaration | 326 |
9. 2. 6. 4 Fehlender Rückgabewert | 328 |
9. 2. 7. PL/SQL-Funktionen in SQL | 329 |
9. 2. 7. 1 Bedingungen für verwendbare PL/SQL-Funktionen | 329 |
9. 2. 7. 2 Einschränkungen und Gefahren | 330 |
9. 2. 7. 3 Geeignete Funktionen und Anwendungsgebiete | 331 |
9. 2. 7. 4 Aufruf von Spalten in PL/SQL-Funktionen | 338 |
9. 3. Eigene Prozeduren verwenden | 340 |
9. 3. 1. Die allgemeine Syntax von Prozeduren | 340 |
9. 3. 2. Blockstruktur von Prozeduren | 342 |
9. 3. 3. Speicherort von Prozeduren | 344 |
9. 3. 4. Wahl der Parameter-Modi und Wertübergabe | 345 |
9. 3. 4. 1 Aufruf von Prozeduren und Parameterübergabe | 345 |
9. 3. 4. 2 Entscheidungen für Parameter-Modi | 347 |
9. 3. 5. Ausnahmebehandlung für Prozeduren | 350 |
9. 3. 6. Übergabe per Referenz und Wert | 353 |
9. 4. Modul-Spezialitäten | 354 |
9. 4. 1. Überladen von Modulen | 354 |
9. 4. 1. 1 Grundvoraussetzungen für das Überladen | 355 |
9. 4. 1. 2 Einsatzbereiche des Überladens | 356 |
9. 4. 2. Vorwärtsdeklaration und Rekursion | 358 |
9. 4. 2. 1 Rekursion von Funktionen | 358 |
9. 4. 2. 2 Vorwärtsdeklaration | 361 |
9. 4. 3. Einsatz von lokalen Modulen | 364 |
9. 4. 3. 1 Funktionen als lokale Module | 365 |
9. 4. 3. 2 Prozeduren als lokale Module | 367 |
9. 4. 3. 3 Sichtbarkeit und Gültigkeit bei lokalen Modulen | 368 |
10. Pakete | 371 |
10. 1. Einführung | 371 |
10. 1. 1. Definition und Strukturen | 371 |
10. 1. 2. Vorteile durch die Verwendung von Paketen | 372 |
10. 1. 3. Aufbau von Paketen | 373 |
10. 1. 4. Sichtbarkeit und Gültigkeit | 376 |
10. 2. Eigene Pakete | 378 |
10. 2. 1. Ein Beispielpaket | 378 |
10. 2. 2. Speicherort von Paketen und ihre Bearbeitung | 381 |
10. 2. 3. Abhängigkeiten zwischen Körpern und Spezifikationen | 382 |
10. 2. 4. Aufruf von Paketen | 385 |
10. 2. 5. Öffentliche und private Elemente | 387 |
10. 2. 6. Berechtigungskonzepte bei gespeicherten Unterprogrammen | 389 |
10. 2. 6. 1 Benutzerrechte bei einzelnen Modulen | 394 |
10. 2. 7. Beispiel-Programm: Testdaten-Erzeugung | 394 |
10. 2. 7. 1 Sinn und Zweck der Testdaten-Erzeugung | 395 |
10. 2. 7. 2 Modularisierung der Anforderungen | 400 |
10. 2. 7. 3 Umsetzung der Anforderungen | 407 |
10. 2. 7. 4 Ausführung und Test des Generators | 419 |
10. 2. 8. Quelltextschutz und Verschlüsselung | 420 |
10. 3. Eingebaute PL/SQL-Pakete | 423 |
10. 3. 1. Systemüberwachung mit DBMS_UTILITY | 424 |
10. 3. 1. 1 Datenbank-Version herausfinden | 424 |
10. 3. 1. 2 Verarbeitung von kommagetrennten Werten | 425 |
10. 3. 1. 3 Aktive Instanzen auszählen | 427 |
10. 3. 2. Große Objekte mit DBMS_LOB bearbeiten | 429 |
10. 3. 2. 1 Allgemeine Eigenschaften von LOBs | 429 |
10. 3. 2. 2 Struktur des DBMS_LOB-Pakets | 431 |
10. 3. 2. 3 Einsatz und Verwendung von internen LOBs | 432 |
10. 3. 2. 4 Einsatz und Verwendung von externen LOBs | 438 |
10. 3. 3. Zugriff auf den Shared Pool | 440 |
10. 3. 4. Nachrichtenaustausch über Pipes | 442 |
10. 3. 5. Datenaustausch via Alarme | 446 |
10. 3. 6. Anwendungsoptimierung und -analyse von PL/SQL-Programmen | 449 |
10. 3. 6. 1 Gefahrenquellen für verbesserungswürdige Leistungen | 450 |
10. 3. 6. 2 Analysewerkzeuge für die Programmleistung | 451 |
11. Trigger | 470 |
11. 1. Einführung | 470 |
11. 1. 1. Typologie | 471 |
11. 1. 2. Einsatzbereiche | 472 |
11. 1. 3. Einschränkungen | 473 |
11. 2. Trigger programmieren | 474 |
11. 2. 1. Allgemeine Trigger-Befehle | 475 |
11. 2. 2. DML-Trigger | 475 |
11. 2. 3. Syntax-Erweiterungen von Triggern | 479 |
11. 2. 3. 1 Pseudodatensätze und die REFERENCING-Klausel | 479 |
11. 2. 3. 2 Bedingungen für betroffene Zeilen | 484 |
11. 2. 4. Instead-of-Trigger | 487 |
11. 2. 5. System-Trigger | 494 |
11. 2. 5. 1 Einsatz der WHEN-Klausel | 505 |
Index | 509 |