Log In
Or create an account ->
Imperial Library
Home
About
News
Upload
Forum
Help
Login/SignUp
Index
Aus dem Lektorat
Inhaltsverzeichnis
Materialien zum Buch
1 Einführung
1.1 Für wen ist dieses Buch geschrieben?
1.2 Der Aufbau des Buches
1.2.1 Teil I: Grundlagen
1.2.2 Teil II: Die Sprache PL/SQL
1.2.3 Teil III: PL/SQL im Einsatz
1.3 Vorwort zur vierten Auflage
2 Verwendete Werkzeuge und Ressourcen
2.1 Oracles Online-Dokumentation
2.1.1 Wo finde ich die benötigten Informationen?
2.1.2 PL/SQL-Grundlagen
2.1.3 Oracle-Packages
2.1.4 Weiterführende Literatur
2.2 Aufsetzen einer Beispieldatenbank
2.3 SQL*Plus
2.4 SQLCL
2.5 SQL Developer
2.6 »explain plan«
2.7 Autotrace
2.8 Runstats
2.9 Trace und tkprof
2.10 Debugger
2.11 Weitere Werkzeuge
2.12 Die Beispielskripte
Teil I Grundlagen
3 Aufbau der Datenbank aus Sicht eines Programmierers
3.1 Grundlegende Arbeitsweise der Datenbank
3.1.1 Anforderungen an ein Datenbankmanagementsystem
3.1.2 Lesekonsistenz
3.1.3 Die Begriffe »Datenbank«, »Schema« und »Tablespace«
3.1.4 Systemtabellen, Data Dictionary und Privilegien
3.1.5 Die Sicht der Anwendung auf die Datenbank
3.2 Logischer Aufbau: Schema, Tablespace und Co.
3.2.1 Schema
3.2.2 Tablespace
3.2.3 Auswirkungen auf die Architektur einer Applikation
3.3 Die physikalische Datenbank
3.3.1 Datendateien
3.3.2 Redo-Log-Dateien
3.3.3 Kontrolldatei
3.3.4 Parameterdatei
3.3.5 Passwortdatei
3.4 Instanz und Speicherstrukturen
3.4.1 Die Speicherbereiche der SGA
3.4.2 Shared Pool
3.4.3 Die Hintergrundprozesse
3.5 Containerdatenbank
3.6 Start der Datenbank
3.7 Verbindungsaufbau zur Datenbank
3.7.1 Verbindungsarten und Treiber
3.7.2 Dedicated-Server-Verbindung
3.7.3 Shared-Server-Verbindung
3.7.4 Database Resident Connection Pool
3.7.5 Und nun? Entscheidungshilfen für den Verbindungsaufbau
4 Datenbankobjekte und SQL
4.1 Tabellen
4.1.1 Heap Organized Table
4.1.2 Index Organized Table
4.1.3 Temporäre Tabellen
4.1.4 Partitionierte Tabellen
4.2 Index
4.2.1 Anmerkung zur Benutzung von Indizes
4.2.2 B*-Baum-Index
4.2.3 Reverse-Key-Index
4.2.4 Funktionsbasierter Index
4.3 Views und Materialized Views
4.3.1 Views
4.3.2 Materialized Views
4.4 PL/SQL-Programm
4.5 Sonstige Datenbankobjekte
4.5.1 Sequenzen
4.5.2 Synonym
4.5.3 Datenbanklink
4.5.4 Große Datenmengen: »CLOB«, »NCLOB«, »BLOB« und »BFile«
4.5.5 Benutzerdefinierte Typen, XML, JSON
4.5.6 Weitere Datenbankobjekte
4.6 Exkurs: Zeichensatzcodierung
4.6.1 Zeichensatzcodierung im Überblick
4.6.2 Zeichensatzcodierung bei Oracle
4.7 Mächtigkeit von SQL
4.7.1 Analytische Funktionen
4.7.2 Hierarchische Abfragen
4.7.3 Error-Logging
4.7.4 Fazit
5 Datensicherheit, -konsistenz und Transaktion
5.1 Lese- und Schreibkonsistenz
5.1.1 Lesekonsistenz
5.1.2 Schreibkonsistenz
5.2 Transaktion
5.2.1 Transaktion zum Schutz der Lesekonsistenz
5.2.2 Transaktion zur Definition eines Geschäftsfalls
5.2.3 Zusammenfassung
5.3 Datenkonsistenz und referenzielle Integrität
5.3.1 Datenintegrität
5.3.2 Performance-Überlegungen zu Datenbank-Constraints
5.3.3 Datenkonsistenz
5.3.4 Zusammenfassung
5.4 Explizites Sperren von Daten durch die Anwendung
5.4.1 Das Problem: Lost Updates
5.4.2 Das optimistische Sperren
5.4.3 Das pessimistische Sperren
5.4.4 Das vorsichtig optimistische Sperren
5.4.5 Und nun? Wann sollten Sie welche Sperrstrategie verwenden?
5.5 Verarbeitung einer SQL-Anweisung
5.5.1 Parsen und Optimierung
5.5.2 Datenlieferung über Cursor
5.6 Die Sperrmechanismen von Oracle
5.6.1 Locks
5.6.2 Latches
5.7 Datensicherheit
5.8 Workshop: Einfluss der Programmierung
5.8.1 Das Ziel unserer Programmierung
5.8.2 Implementierung des Tests
6 Programmierung der Datenbank
6.1 Erweiterung der Datenbankfunktionalität
6.2 Programmierung der Datenkonsistenz
6.2.1 Datenbanktrigger
6.2.2 Datenzugriff über PL/SQL
6.2.3 Datenkonsistenz jenseits referenzieller Integrität
6.3 Programmierung der Datensicherheit
6.4 Anwendungsprogrammierung mit PL/SQL
6.4.1 PL/SQL auf der Client-Seite
6.5 Unterstützung der Administration durch PL/SQL
6.5.1 Einsatz von PL/SQL in Skripten
6.5.2 Verwaltung wiederkehrender Aufgaben mit Scheduler und Jobs
6.5.3 Datenbanktrigger im Umfeld der Datensicherung und des Auditings
Teil II Die Sprache PL/SQL
7 Die Blockstruktur und Syntax von PL/SQL
7.1 Das Grundgerüst: der PL/SQL-Block
7.1.1 Deklaration von Variablen
7.1.2 Schachtelung von Blöcken zur Fehlerbehandlung
7.1.3 Gültigkeitsbereich von Variablen
7.2 Prozeduren
7.2.1 Prozeduren mit Parametern
7.2.2 Formen der Parameterzuweisung
7.2.3 Optionale Parameter
7.2.4 Beliebig viele Parameter an eine Methode übergeben
7.3 Funktionen
7.4 Datenbanktrigger
7.5 Packages
7.5.1 Package-Spezifikation
7.5.2 Package-Körper
7.5.3 Aufruf von Prozeduren und Methoden in Packages
7.6 Ausführungsrechte von PL/SQL-Blöcken
7.7 Compiler-Anweisungen (Pragma)
7.7.1 Die autonome Transaktion
7.7.2 Initialisierung eigener Fehler
7.8 Best Practices
8 Kontrollstrukturen
8.1 Auswertende Anweisung 1 (»if then else«-Anweisung)
8.2 Auswertende Anweisung 2 (»case«-Anweisung)
8.2.1 Einfache »case«-Anweisung
8.2.2 Aufruf der »case«-Anweisung als SQL-Ausdruck
8.2.3 Die auswertende »case«-Anweisung
8.3 Einfache Schleifen
8.3.1 Basisschleife (Schleife)
8.3.2 Abweisende Schleife 1 (»for«-Schleife)
8.3.3 Abweisende Schleife 2 (»while«-Schleife)
8.3.4 Best Practices
8.4 Konditionale Kompilierung
8.4.1 Die Auswahldirektive (Selection Directive)
8.4.2 Die Abfragedirektive (Inquiry Directive)
8.4.3 Die Errordirektive (Error Directive)
8.5 Aus der Mottenkiste: Konzepte, die Sie nicht verwenden sollten
8.5.1 Label
8.5.2 »continue«- und »goto«-Anweisung
9 Datentypen in PL/SQL
9.1 Skalare Datentypen
9.1.1 SQL-Datentypen
9.1.2 Abweichende Größen von PL/SQL-Datentypen
9.1.3 Basistypen und Untertypen in PL/SQL
9.1.4 SQL-Datentypen, die in PL/SQL nicht existieren
9.1.5 PL/SQL-Datentypen, die in SQL nicht existieren
9.1.6 Objektorientierte Typen
9.1.7 Benutzerdefinierte Datentypen
9.1.8 Ableitung von Variablentypen aus dem Data Dictionary
9.2 Kollektionen in PL/SQL
9.2.1 Record
9.2.2 Assoziative Tabellen
9.2.3 Massenverarbeitung mit assoziativen Tabellen
9.2.4 »VARRAY« oder »NESTED_TABLE« als Alternative zu einer assoziativen Tabelle
9.3 Cursor
10 Cursor
10.1 Lebenszyklus eines Cursors
10.1.1 Deklaration eines Cursors
10.1.2 Lesen eines Datensatzes aus dem Cursor
10.1.3 Schließen des Cursors
10.2 Cursor-Attribute
10.3 Parametrisierte Cursor
10.4 Mengenverarbeitung mit »bulk collect«
10.5 Kurzform: die »cursor for«-Schleife
10.6 Implizite versus explizite Cursor
10.6.1 Implizite oder explizite Cursor
10.6.2 Implizite oder explizite Cursor-Kontrolle
10.7 Cursor-Variablen (»ref«-Cursor)
10.7.1 Starke Cursor-Variable
10.7.2 Schwache Cursor-Variable
10.8 Cursor-Ausdrücke
10.9 Gemeinsamer Zugriff auf Daten über verteilte Cursor
10.10 Tabellenfunktionen
10.10.1 Was ist eine Tabellenfunktion?
10.10.2 Workshop: Tabellenfunktion
10.10.3 Verwendung von Tabellenfunktionen
10.10.4 Workshop: Erstellung einer Tabellenfunktion
10.10.5 Polymorphe Tabellenfunktion
11 Events in der Datenbank: Programmierung von Triggern
11.1 DML-Trigger
11.1.1 Anweisungs- versus Zeilentrigger
11.1.2 Der Triggerkörper
11.1.3 Wann wird ein Trigger ausgelöst?
11.1.4 Das Mutating-Table-Problem
11.1.5 Compound Trigger
11.1.6 Workshop: Lösung des Mutating-Table-Problems mit einem Compound Trigger
11.1.7 Cross Edition Trigger
11.1.8 Benennungskonvention von Triggern
11.2 »instead of«-Trigger
11.3 Einsatzbereiche von DML-Triggern
11.3.1 Erweiterung der Datenkonsistenzprüfung über Constraints hinaus
11.3.2 Workshop: Statusänderungen in einer bestimmten Reihenfolge durchführen
11.3.3 Implementierung einfacher Geschäftsregeln
11.3.4 Historisierung, Logging und Auditing von Daten
11.3.5 Workshop: generisches Logging
11.3.6 Workshop: Historisierung von Daten mit einem »instead of«-Trigger
11.4 Wann Sie DML-Trigger nicht verwenden sollten
11.4.1 Auditing mithilfe von Triggern
11.4.2 Schutz der Datenintegrität
11.5 Datenbanktrigger
11.5.1 Ereignisattribute
11.5.2 Datenbankereignisse
11.5.3 Benutzerbezogene Ereignisse
11.5.4 DDL-Ereignisse
11.5.5 Systemereignisse
11.6 Zusammenfassung
12 Packages
12.1 Trennung von öffentlicher und privater Logik
12.1.1 Deklaration
12.1.2 Implementierung
12.1.3 Zusammenfassung
12.2 Überladung in Packages
12.2.1 Deklaration
12.2.2 Implementierung
12.2.3 Zusammenfassung
12.3 Ausführungsrechte von Packages
12.3.1 Rollen und Berechtigungskonzepte
12.3.2 Erweiterungen des Aufruferrechte-Berechtigungskonzepts
12.3.3 Steuerung des Zugriffs auf ein Package
12.4 Packages und die Dependency Chain
12.5 Verschlüsselung von Package-Code
12.5.1 Das »wrap«-Utility
12.5.2 Verwendung des Packages »dbms_ddl«
12.6 Oracle-Packages
12.6.1 Das Package »standard«
12.6.2 Wichtige Oracle-Packages
12.7 Workshop: Verwaltung von Anwendungsparametern
12.7.1 Das Problem und die Lösungsidee
12.7.2 Vorüberlegungen zur Parametertabelle
12.7.3 Die Parametertabelle
12.7.4 Einrichtung der Parametertabelle und der Zugriffsrechte
12.7.5 Das Parameter-Package
12.7.6 Das Package im Einsatz
13 Erweiterung von SQL
13.1 Wann SQL erweitert werden sollte
13.1.1 Bleiben Sie auf dem aktuellen Wissensstand
13.1.2 Voraussetzungen für die Erweiterung von SQL
13.2 SQL durch eigene Funktionen erweitern
13.2.1 Anforderungen an den PL/SQL-Block
13.2.2 Nebenwirkungsfreiheit (Purity)
13.2.3 Optimizer Hints und Klauseln
13.2.4 Das Pragma »restrict_references«
13.2.5 Workshop: deterministische Funktion
13.3 Workshop: Berechnung der Fakultät
13.3.1 Einschränkung der Fakultätsfunktion auf definierte Werte
13.3.2 Zielvorgabe
13.3.3 Und was ist mit Rekursion?
13.4 Gruppenfunktionen selbst erstellen
13.4.1 Arbeitsweise von Gruppenfunktionen
13.4.2 Workshop: Erstellung einer Gruppenfunktion
13.4.3 Test der Gruppenfunktion
13.4.4 Zusammenfassung
13.5 Workshop: Code-Generator für Gruppenfunktionen
14 Dynamisches SQL
14.1 Dynamisches SQL mittels »execute immediate«
14.1.1 Verwendung von Bindevariablen
14.2 Dynamisches SQL mit Cursor-Variablen
14.3 Workshop: Erstellung einer Prozedur als Schnittstelle zu einem externen Programm
14.3.1 Die Aufgabenstellung
14.3.2 Der Lösungsansatz
14.3.3 Vorbereitende Arbeiten
14.3.4 Die Prozedur für den Datenzugriff
14.4 DBMS_SQL-Package
14.4.1 Workshop: Code-Generator
14.5 Sicherheit bei dynamischem SQL
14.5.1 SQL-Injection über Suchparameter
14.5.2 SQL-Injection über Formatangaben
14.5.3 SQL-Injection über das Einschmuggeln zusätzlicher Anweisungen
14.5.4 Vermeidung von SQL-Injection 1: Bindevariablen
14.5.5 Vermeidung von SQL-Injection 2: »dbms_assert«
14.6 SQL-Makros
14.6.1 Skalare SQL-Makros
14.6.2 Tabellen-SQL-Makros
14.7 Polymorphe Tabellenfunktionen
14.7.1 Ein erstes Beispiel
14.7.2 Beispiel 2: Konvertierung in JSON oder XML
14.7.3 Mehrere PTF in einem Package
14.7.4 PTF zum Erzeugen neuer Zeilen
14.7.5 PTF und der Execution Store (XSTORE)
15 Exception
15.1 Oracle-Fehler
15.1.1 Benannte Fehler
15.1.2 sqlerrm- und sqlcode-Funktionen und der Fehler-Stack
15.1.3 Nicht benannte Fehler benennen
15.2 Applikationsfehler erstellen und bearbeiten
15.2.1 Fehler direkt mit »raise_application_error« erzeugen
15.2.2 Fehler aus einem Fehler-Package erstellen lassen
15.2.3 Zentralisierung der Fehlermeldungen über »lmsgen«
15.2.4 Workshop: Wrapper-Package um »utl_lms«
15.2.5 Zusammenfassung: Fehlermeldungen mit »utl_lms«
15.3 Workshop: zentralisierter Fehler-Handler mit einem Trigger
15.4 Zusammenfassung
Teil III PL/SQL im Einsatz
16 Arbeiten mit LOBs (Large Objects)
16.1 Technische Struktur
16.1.1 Einsatz von LOB-Datentypen in der Datenbank
16.1.2 LOB als PL/SQL-Variable
16.1.3 LOB als Methodenparameter
16.1.4 SecureFiles
16.2 Die Datentypen »CLOB«, »NCLOB«, »BLOB« und »BFILE«
16.2.1 CLOB und NCLOB
16.2.2 Der binäre Datentyp »BLOB«
16.2.3 BFile
16.3 Das Package »DBMS_LOB«
16.3.1 Schreibzugriff auf temporäre oder persistente LOBs
16.3.2 Verwaltung temporärer und persistenter LOBs
16.3.3 API für BFile-LOB
16.3.4 Zugriff auf LOBs durch die Anwendung
16.4 Workshop: Hilfsfunktionen zum Arbeiten mit LOBs
17 Arbeiten mit XML
17.1 Der Datentyp »XMLType«
17.1.1 Verwendung von »XMLType« als Tabellen- oder Spaltentyp
17.1.2 »XMLType«-Member-Functions
17.1.3 Umformung von XML mittels XSLT
17.2 Die Speicherung von XML-Daten in der Datenbank
17.3 XML aus relationalen Daten erzeugen
17.3.1 Der SQL/XML-Standard
17.3.2 Das Package »DBMS_XMLGEN«
17.4 Relationale Daten aus XML extrahieren
17.4.1 Extraktion relationaler Daten mit »XMLTable«
17.4.2 Extraktion relationaler Daten mittels Objektorientierung
17.5 XML mit PL/SQL verarbeiten
17.5.1 Die Programmierung mittels DOM-Baum
17.5.2 Die XML-Packages
17.6 Die XML-Datenbank
17.6.1 Einführung in die XML-Datenbank
17.6.2 Speicherung und Veröffentlichung binärer Dokumente und XML-Dokumente
17.6.3 Dokumente über XDB verwalten
17.6.4 Zugriffsschutz und Sicherheit von XDB
17.6.5 Versionierung von Ressourcen
18 Arbeiten mit JSON
18.1 JSON
18.1.1 Überblick: Was ist JSON?
18.1.2 Der Datentyp JSON
18.1.3 Der Datentyp JSON (revisited)
18.1.4 Abfragen gegen JSON-Instanzen
18.1.5 JSON Data Guide
18.2 Programmierung von JSON mit PL/SQL
18.2.1 Übersicht über die PL/SQL-JSON-Typen
18.2.2 Objektmethoden
18.2.3 Manipulation mittels APEX-Packages
18.3 SODA (Simple Oracle Document Access)
18.3.1 SODA-Kollektion
18.3.2 SODA-Operationen
18.3.3 SODA-Dokument
18.3.4 SODA und Transaktionen
19 Objektorientierung
19.1 Einführung in die Objektorientierung
19.1.1 Alles ist ein Objekt
19.1.2 Das zweite Reizwort: Vererbung!
19.1.3 Abstrakte und finale Klassen
19.1.4 Statische Methoden
19.1.5 Objektidentität versus »Statement of Truth«
19.1.6 Klassen haben komplexe Strukturen
19.1.7 Auswirkungen auf die Datenbankprogrammierung
19.2 Objektorientierte Datentypen
19.2.1 »object«
19.2.2 »varray«
19.2.3 »nested table«
19.2.4 Vergleiche von Kollektionen
19.2.5 Methoden von Kollektionstypen
19.2.6 Workshop: Liste von Werten übergeben
19.3 Objektorientierte Datenmodelle
19.4 Workshop: der Datentyp »MoneyType«
19.4.1 Vorüberlegungen
19.4.2 Implementierung des Typs »MoneyType«
19.4.3 Der Typkörper
19.4.4 Implementierung des Packages »moneytype_pkg«
19.4.5 Der Package-Körper
19.4.6 Die Rechtesituation ab Version 11g
19.4.7 Erweiterung durch Vererbung
19.5 Objektorientierte Anwendungsentwicklung und relationale Datenbanken
19.5.1 Das Problem des Impedance Mismatch
19.5.2 Lösungsansatz 1: die Vision der generischen Datenbank
19.5.3 Lösungsansatz 2: objektrelationale Mapping-Werkzeuge
19.5.4 Lösungsansatz 3: das »Smart-Database«-Paradigma
20 Integration von Oracle in Applikationen
20.1 Sperrung von Daten bei der Datenänderung
20.1.1 Transaktionsschutz innerhalb der Datenbank
20.1.2 Erweiterter Fokus: Datensicherung im Umfeld von Anwendungen
20.1.3 Pessimistisches Locking
20.1.4 Optimistisches Sperren
20.1.5 Kombination aus optimistischem und pessimistischem Sperren
20.1.6 Database-Change-Notification-basiertes Locking
20.2 Speicherung von Session-Informationen
20.2.1 Grundlagen eines Kontextes
20.2.2 Session-Kontext
20.2.3 Globally Accessed Context
20.2.4 Workshop: Package zur Verwaltung von Kontexten
20.3 Zugriff auf Daten über PL/SQL-Packages
20.3.1 Kapselung von DML-Operationen in Packages
20.3.2 Vermeidung von Triggern durch Packages
20.3.3 Integration datenbezogener Geschäftsregeln
20.4 Workshop: Keimzelle einer sicheren Datenbankanwendung
20.4.1 Das Projekt
20.4.2 Übersicht über die Architektur
20.4.3 Die »logon«-Prozedur
20.4.4 Aufsetzen der Schemata
20.4.5 Die Packages
20.4.6 Test der Architektur
20.4.7 Zusammenfassung und Ausblick
21 Performance-Tuning und Codeanalyse
21.1 Regeln zur Performance-Optimierung
21.1.1 Nutzen Sie SQL, falls dies möglich ist
21.1.2 Betrachten Sie die Datenbank als entfernte Ressource
21.1.3 Benutzen Sie Bindevariablen
21.1.4 Arbeiten Sie mengenorientiert
21.1.5 Bereiten Sie die Daten vor der Programmierung optimal vor
21.1.6 Arbeiten Sie sich in die Grundkonzepte der Datenbank ein
21.1.7 Nutzen Sie PL/SQL bis zur Neige
21.1.8 Kontrollieren Sie den Speicherverbrauch
21.1.9 Glauben Sie nicht an Wunder
21.1.10 Salvatorische Klausel
21.2 Optimierungsmöglichkeiten von PL/SQL
21.2.1 Automatisierte Codeoptimierung
21.2.2 Subprogram-Inlining
21.2.3 Native Kompilierung
21.2.4 Caching
21.2.5 Feingranulare Abhängigkeitsverwaltung
21.3 Compiler-Warnungen
21.4 PL/Scope
21.4.1 Welche Information bietet PL/Scope?
21.4.2 Die View »USER_IDENTIFIERS«
21.4.3 Die View »USER_STATEMENTS«
21.4.4 Administration von PL/Scope
21.5 PL/SQL Hierarchical Profiler
21.5.1 Der hierarchische Profiler im SQL Developer
21.5.2 Voraussetzungen für den Einsatz des hierarchischen Profilers
21.5.3 Das Package »DBMS_HPROF«
21.5.4 Die Analyse
21.5.5 Ein etwas realitätsnäheres Beispiel
21.5.6 Umgehung der Limitierungen
21.5.7 Optionen der Funktion »dbms_hprof.analyze«
21.6 Den Speicherverbrauch von PL/SQL überwachen
21.6.1 Die Speicherverwaltung von PL/SQL
21.6.2 Überwachung des Arbeitsspeichers
22 Workshop: PL/SQL Instrumentation Toolkit (PIT)
22.1 Überblick: die Idee und die Architektur
22.1.1 Funktionsumfang
22.1.2 Anwendungsbeispiel
22.1.3 Die beteiligten Komponenten
22.1.4 Idee und Arbeitsweise
22.2 Beschreibung der einzelnen Komponenten
22.2.1 Meldung
22.2.2 Call-Stack
22.2.3 Kontext
22.2.4 Adapter
22.2.5 Das Package »MSG«
22.2.6 Ausgabemodul
22.2.7 Die PIT-API
22.2.8 Internationalisierung
22.2.9 Die zentrale Komponente »PIT_INTERNAL«
22.2.10 Ein konkretes Ausgabemodul
22.3 Implementierung des PIT-Administrations-Packages
22.3.1 Funktionsüberblick und Implementierungsstrategie
22.3.2 Implementierungsdetails
22.4 Weitere Ausgabemodule
22.4.1 Ausgabe in eigene Fehlerdateien
22.4.2 Ausgabe in APEX
22.4.3 Ausgabe in Alert-Log- oder Trace-Dateien
22.4.4 Ausgabe in Logging-Tabellen
22.4.5 Meldung als E-Mail versenden
22.4.6 Meldungen in JMS integrieren
Stichwortverzeichnis
Rechtliche Hinweise
Über den Autor
← Prev
Back
Next →
← Prev
Back
Next →