Upload
miki-bundesmaca
View
215
Download
0
Embed Size (px)
Citation preview
Anwendersoftware (AS) Anwendersoftware (AS)
Datenbanken und Informationssysteme
Kapitel 1: Anwendungsprogrammierschnittstelle
Bernhard Mitschang
Wintersemester 2013/2014
Teile zu diesem Folienskript beruhen auf einer hnlichen Vorlesung, gehalten von Prof. Dr. T. Hrder am Fachbereich Informatik der Universitt Kaiserslautern und Prof. Dr. N. Ritter am Fachbereich Informatik der Universitt Hamburg. Fr dieses Skriptum verbleiben alle Rechte (insbesondere fr Nachdruck) bei den Autoren.
Anwendungsprogrammierschnittstelle
2
bersicht
Kopplung von DB- und Programmiersprache Wirtsspracheneinbettung und bersetzung Eingebettetes statisches SQL SQL/PSM Dynamisches SQL Call-Level-Interface (CLI)
Anwendungsprogrammierschnittstelle
3
Kopplung
bersicht
SQL-Einbettung
CALL-Schnittstelle (Call Level Interface CLI)
statisch dynamisch
Integrierte Sprachen/Spracherweiterungen persistente Programmiersprachen DB-Programmiersprachen
Kopplung
Anwendungsprogrammierschnittstelle
4
Call-Schnittstelle (Aufruftechnik)
prozedurale Schnittstelle DB-Funktionen werden durch Bibliothek von Prozeduren realisiert DB-Anweisung wird durch expliziten Prozeduraufruf an das
Laufzeitsystem des DBS bergeben, z. B. CALL DBS (INSERT INTO ) Beispiele:
CLI: Call Level Interface (SQL-Standard) ODBC: Open Database Connectivity (Microsoft) JDBC: Java Database Connectivity
Quelle: [ME00]
Anwendungsprogrammierschnittstelle
5
SQL-Einbettung
Spracherweiterung um spezielle DB-Befehle (EXEC SQL ...) komfortablere Programmierung als mit CLI statische Einbettung
Vorbersetzer (Precompiler) wandelt DB-Aufrufe in Prozeduraufrufe um
Nutzung der normalen PS-bersetzer fr umgebendes Programm SQL-Anweisungen mssen zur bersetzungszeit feststehen im SQL-Standard untersttzte Sprachen:
C, COBOL, FORTRAN, Ada, PL1, Pascal, MUMPS, Java, ... dynamische Einbettung:
Konstruktion von SQL-Anweisungen zur Laufzeit Beispiele:
Embedded SQL (ESQL), Embeded Dynamic SQL (EDSQL) SQLJ
Quelle: [ME00]
Anwendungsprogrammierschnittstelle
6
Integrationsanstze
persistente Programmiersprachen, DB-Programmiersprachen untersttzen typischerweise nur
ein Typsystem Navigation (satz-/objektorientierter Zugriff) wnschenswert sind jedoch Mehrsprachenfhigkeit und deskriptive
DB-Operationen (mengenorientierter Zugriff) Beispiele:
JADE, PM3, Napier88
Quelle: [HC99, MBC+94]
Anwendungsprogrammierschnittstelle
7
Relationale Anwendungsprogrammierschnittstellen (APIs) bieten Mehrsprachenfhigkeit und deskriptive DB-Operationen, erfordern jedoch Manahmen zur berwindung der sog.
Fehlanpassung (impedance mismatch): Satzorientierung vs. Mengenorientierung
Kernprobleme der API bei konventionellen Programmiersprachen Konversion und bergabe von Werten bergabe aktueller Werte von Wirtssprachenvariablen
(Parametrisierung von DB-Operationen) Mengenorientierung von DB-Operationen
- Wie und in welcher Reihenfolge werden Zeilen/Stze dem AP zur Verfgung gestellt?
- Cursor-Konzept
Relationale APIs
Anwendungsprogrammierschnittstelle
8
bersicht
Kopplung von DB- und Programmiersprache Wirtsspracheneinbettung und bersetzung Eingebettetes statisches SQL SQL/PSM Dynamisches SQL Call-Level-Interface (CLI)
Anwendungsprogrammierschnittstelle
9
Wirtsspracheneinbettung und bersetzung
Call-Schnittstelle DB-Anweisung wird durch
expliziten Aufruf an das Laufzeitsystem des DBS bergeben Beispiel: CALL DBS (OPEN C1)
Es sind prinzipiell keine DBS-spezifischen Vorkehrungen bei der AP-bersetzung erforderlich!
SQL-Einbettung syntaktische Unterscheidung
zwischen Programm- und DB-Anweisungen
DB-Anweisung wird als Zeichenkette ins AP integriert Beispiel: EXEC SQL OPEN C1
typischerweise Einsatz eines Vorbersetzers PC (Precompiler)
PC erzeugt fr DB-Anweisungen spezielle Call-Aufrufe im AP, so dass das modifizierte AP mit dem Wirtssprachencompiler C bersetzt werden kann
Anwendungsprogrammierschnittstelle
10
Von der bersetzung bis zur Ausfhrung
Embedded-SQL- Programm z.B. in C
Linker
C-Programm C + DBS-Aufrufe
SQL-Precompiler
Wirtssprachen- Compiler C
Loader
Zugriffsmodul
Datenbankkatalog
Programmbibliothek
Programmteil in Maschinencode
Ausfhrbares Progr. Lademodul
Anwendungsprogrammierschnittstelle
11
Von der bersetzung bis zur Ausfhrung
Vorbersetzung des AP Entfernung aller Embedded-SQL-
Anweisungen aus dem Programm (Kommentare)
Ersetzung durch programmiersprachen-spezifische DBS-Aufrufe
Erzeugung eines SQL-freien Programms in der Programmiersprache
DBS-seitige Vorbereitung: Analyse und Optimierung der SQL-Anweisungen und Erstellung eines Zugriffsmoduls im DB-Katalog
Embedded-SQL- Programm z.B. in C
C-Programm C + DBS-Aufrufe
SQL-Precompiler
Zugriffsmodul
Datenbankkatalog
Anwendungsprogrammierschnittstelle
12
Von der bersetzung bis zur Ausfhrung
bersetzung des AP Umwandlung der
Anweisungen der hheren Programmiersprache in Maschinencode (Objektmodul) und Abspeicherung in Programmbibliothek
SQL-Anweisungen fr Compiler nicht mehr sichtbar
Von zentraler Bedeutung: - Anfrageauswertung/-
optimierung des DBMS ist im Wesentlichen fr die effiziente Abarbeitung der SQL-Anweisungen verantwortlich
Wirtssprachen- Compiler C
Programmbibliothek
Programmteil in Maschinencode
C-Programm C + DBS-Aufrufe
Anwendungsprogrammierschnittstelle
13
Von der bersetzung bis zur Ausfhrung
Linker Zusammenfgen der
Objektmodule zu lauffhigem Programm
Hinzufgen des SQL-Laufzeitsystems
Loader Laden des ausfhrbaren
Programms in den Speicher Anbinden des Zugriffsmoduls
aus DB-Katalog und automatische berprfung seiner Gltigkeit
Programmstart
Linker
Loader
Programmbibliothek
Programmteil in Maschinencode
Ausfhrbares Progr. Lademodul Zugriffsmodul
Anwendungsprogrammierschnittstelle
14
Auswertungstechnik
Spektrum von Verfahren mit folgenden Eckpunkten: Maximale Vorbereitung einer DB-Anweisung
- Fr eine DB-Anweisung wird ein zugeschnittenes Programm (Zugriffsmodul) zur bersetzungszeit (Z) erzeugt
- Zur Ausfhrung einer DB-Anweisung (Laufzeit, LZ) wird das Zugriffsmodul geladen und abgewickelt
- Durch Aufrufe des DBMS (genauer: des Zugriffssystems) wird das Ergebnis abgeleitet
Keine Vorbereitung einer DB-Anweisung - typisch fr Call-Schnittstellen - Allgemeines Programm (Interpreter) akzeptiert DB-Anweisungen
als Eingabe und erzeugt durch Aufrufe des Zugriffssystems das Ergebnis
Anwendungsprogrammierschnittstelle
15
Wahl des Bindezeitpunkts
Was heit Binden? Wann werden die fr die Abwicklung einer DB-Anweisung erforderlichen Operationen vom DB-Schema abhngig?
bersetzungszeit vs. Laufzeit
AP:
DB-Katalog: SYSREL: Tabellenbeschreibungen: Pers, . . .
SYSATTR: Attributbeschreibungen: Pnr, Name, Gehalt, . . . SYSINDEX: IPers(Beruf), . . . SYSAUTH: Nutzungsrechte
SYSINT/RULES: Integrittsbedingungen, Zusicherungen, . . .
Select Pnr, Name, Gehalt From Pers Where Beruf = Programmierer
Anwendungsprogrammierschnittstelle
16
Wahl des Bindezeitpunkts
Zeitpunkt des Bindens
bersetzungszeit (Z) AP
Laufzeit (LZ)
Invalidierung durch Schemanderungen
bersetzungskosten: unerheblich fr Antwortzeit (AZ)
Zugriffe (zur LZ): effizient
datenabhngig!
Interpretation: erheblich fr AZ
Zugriffe (zur LZ): teuer
datenunabhngig!
Ausgleich gesucht!
Anwendungsprogrammierschnittstelle
17
Auswertungstechnik und Bindezeitpunkt
Maximale Vorbereitung aufwendige Optimierung und Erstellung eines Zugriffsmoduls maximale Auswirkungen von Schemanderungen, welche die
DB-Anweisung betreffen - Schemanderungen nach der bersetzung werden nicht
bercksichtigt (neue Zugriffspfade, genderte Statistiken etc.) - Invalidierung des Zugriffsmoduls und erneute Erstellung
Keine Vorbereitung/Interpretation Interpreter wertet Anweisung (als Zeichenfolge) zur Laufzeit aus aktueller DB-Zustand wird automatisch bercksichtigt sehr hohe Ausfhrungskosten bei Programmschleifen sowie durch
hufige Katalogzugriffe interessant vor allem fr Ad-hoc-Anfragen bzw. dynamisches SQL
Anwendungsprogrammierschnittstelle
18
bersicht
Kopplung von DB- und Programmiersprache Wirtsspracheneinbettung und bersetzung Eingebettetes statisches SQL SQL/PSM Dynamisches SQL Call-Level-Interface (CLI)
Anwendungsprogrammierschnittstelle
19
Eingebettetes statisches SQL: Beispiel
exec sql include sqlca; /* SQL Communication Area */
main () { exec sql begin declare section; char X[3] ; int GSum; exec sql end declare section; exec sql connect to dbname; exec sql insert into Pers (Pnr, Name) values (4711, Ernie); exec sql insert into Pers (Pnr, Name) values (4712, Bert); printf (Anr ? ) ; scanf ( %s , X); exec sql select sum (Gehalt) into :GSum from Pers where Anr = :X; /* Es wird nur ein Ergebnissatz zurckgeliefert! */ printf (Gehaltssumme: %d\n , GSum) exec sql commit work; exec sql disconnect; }
Anwendungsprogrammierschnittstelle
20
Anbindung einer SQL-Anweisung an die Wirtssprachen-Umgebung eingebettete SQL-Anweisungen werden durch exec sql eingeleitet
und durch spezielles Symbol (hier ;) beendet, um dem Compiler eine Unterscheidung von anderen Anweisungen zu ermglichen
Verwendung von AP-Variablen in SQL-Anweisungen verlangt Deklaration innerhalb eines declare section-Blocks sowie Angabe des Prfix : innerhalb von SQL-Anweisungen
Kommunikationsbereich SQLCA - Rckgabe von Statusanzeigern u..
bergabe der Werte einer Zeile mit Hilfe der INTO-Klausel - INTO target-commalist (Variablenliste des Wirtsprogramms) - Anpassung der Datentypen (Konversion)
Aufbau/Abbau einer Verbindung zu einem DBS: connect/disconnect
Eingebettetes statisches SQL
Anwendungsprogrammierschnittstelle
21
Cursor-Konzept
Zweck satz-weise Abarbeitung von Ergebnismengen Trennung von Qualifikation und Bereitstellung/Verarbeitung von
Zeilen Cursor ist ein Iterator,
der einer Anfrage zugeordnet wird und mit dessen Hilfe die Zeilen der Ergebnismenge einzeln (one tuple at a
time) im Programm bereitgestellt werden Cursor-Deklaration
Syntax
Beispiel
DECLARE cursor CURSOR FOR table-exp [ORDER BY order-item-commalist]
DECLARE C1 CURSOR FOR SELECT Name, Gehalt, Anr FROM Pers WHERE Anr = K55 ORDER BY Name;
Anwendungsprogrammierschnittstelle
22
Cursor-Operationen OPEN C1 FETCH C1 INTO Var1, Var2, Var3 CLOSE C1
Cursor-Konzept
AWP in satzorientierter Programmiersprache
mengenorientiertes DBS
1. Anfrage: OPEN C1
2. Anfrage auswerten, Ergebniszeile(n) im Cursor bereitstellen
4. Cursor schlieen (CLOSE C1)
3. Zeile sequentiell holen und verarbeiten (FETCH C1)
Anwendungsprogrammierschnittstelle
23
Reihenfolge der Ergebniszeilen systembestimmt benutzerspezifiziert (ORDER BY)
Wann wird die Ergebnismenge ermittelt? schritthaltende Auswertung durch das DBS?
Verzicht auf eine explizite Zwischenspeicherung ist nur bei einfachen Anfragen mglich.
daher Kopie bei OPEN meist erforderlich (ORDER BY, Join, Aggregat-Funktionen, ...)
Cursor-Konzept
Anwendungsprogrammierschnittstelle
24
Cursor: Beispiel
exec sql begin declare section; char X[50], Y[3]; exec sql end declare section; exec sql declare C1 cursor for select Name from Pers where Anr = :Y; printf(Bitte Anr eingeben: \n); scanf(%d, Y); exec sql open C1; while (sqlcode == OK) { exec sql fetch C1 into :X; printf(Angestellter %d\n, X); } exec sql close C1;
Anwendungsprogrammierschnittstelle
25
Aktualisierung
Aktualisierung mit Bezugnahme auf eine Position Wenn die Zeilen, die ein Cursor verwaltet (active set), eindeutig den
Zeilen einer Tabelle entsprechen, knnen sie ber Bezugnahme durch den Cursor gendert werden.
Syntax
Beispiel while (sqlcode == ok) {
exec sql fetch C1 into :X; ... /* Berechne das neue Gehalt in Z /* exec sql update Pers set Gehalt = :Z where current of C1; }
positioned-update ::= UPDATE table SET update-assignment-commalist WHERE CURRENT OF cursor positioned-delete ::= DELETE FROM table WHERE CURRENT OF cursor
Anwendungsprogrammierschnittstelle
26
1. 1 Cursor
2. Mehrere Cursor Verknpfung der
Zeilen im Programm
3. Positionsbezogene Aktualisierung
C1
C1 C2 C3
C1 VariableINTO
Update, Delete
SQL-Programmiermodell
Anwendungsprogrammierschnittstelle
27
4. Abhngige Cursor
C1Wert1
Wert2
C2
C2
C3
C3
C3Wert13
Wert11
Wert12
Wert21...
...
SQL-Programmiermodell
Anwendungsprogrammierschnittstelle
28
Struktur (Otnr, Utnr, Anzahl)
T V 5T N 100T Q 1T F 1V N 10Q N 5Q S 2F N 8F S 3
Beispiel: Stcklistenauflsung
Tabelle Struktur (Otnr, Utnr, Anzahl) Aufgabe: Ausgabe aller Endprodukte sowie deren Komponenten max. Schachtelungstiefe sei bekannt (hier: 2)
Tragflche
Fahrwerk
Scharnier
Verstrebung Querruder
Niete
1
328
5
100
10
51
Anwendungsprogrammierschnittstelle
29
Beispiel: Stcklistenauflsung
exec sql begin declare section; char T0[10], T1[10], T2[10]; int Anz;
exec sql end declare section; exec sql declare C0 cursor for
select distinct Otnr from Struktur S1 where not exists (select * from Struktur S2 where S2.Utnr = S1.Otnr);
exec sql declare C1 cursor for select Utnr, Anzahl from Struktur where Otnr = :T0;
exec sql declare C2 cursor for select Utnr, Anzahl from Struktur where Otnr = :T1; ...
Anwendungsprogrammierschnittstelle
30
... exec sql open C0; while (1) { exec sql fetch C0 into :T0; if (sqlcode == notfound) break; printf ( %s\n , T0); exec sql open C1; while (2) {exec sql fetch C1 into :T1, :Anz; if (sqlcode == notfound) break; printf ( %s: %d\n , T1, Anz); exec sql open C2; while (3) { exec sql fetch C2 INTO :T2, :Anz; if (sqlcode == notfound) break; printf ( %s: %d\n , T2, Anz); } exec sql close C2; } /* end while (2) */ exec sql close C1; } /* end while (1) */ exec sql close C0;
Beispiel: Stcklistenauflsung
Anwendungsprogrammierschnittstelle
31
Beispiel: Stcklistenauflsung
Ausgabe:
T V: 5 N: 10 N: 100 Q: 1 N: 5
S: 2 F: 1 N: 8 S: 3
Tragflche
Fahrwerk
Scharnier
Verstrebung Querruder
Niete
1
328
5
100
10
51
Anwendungsprogrammierschnittstelle
32
Erweiterungen zum Cursor-Konzept
Syntax: cursor-def ::= DECLARE cursor [SENSITIVE | INSENSITIVE | ASENSITIVE] [SCROLL | NO SCROLL] CURSOR [WITH HOLD | WITHOUT HOLD] [WITH RETURN | WITHOUT RETURN] FOR table-exp [ORDER BY order-item-commalist] [FOR {READ ONLY | UPDATE [OF column-commalist]}]
Anwendungsprogrammierschnittstelle
33
Sichtbarkeit von nderungen
INSENSITIVE CURSOR T sei die Zeilenmenge, die sich fr den Cursor zum OPEN-Zeitpunkt
(Materialisierung) qualifiziert Spezifikation von INSENSITIVE bewirkt, dass eine separate Kopie von
T angelegt wird und der Cursor auf die Kopie zugreift Aktualisierungen, die T betreffen, werden in der Kopie nicht sichtbar
gemacht; solche nderungen knnten z. B. direkt oder ber andere Cursor erfolgen
ber einen insensitiven Cursor sind keine Aktualisierungsoperationen mglich (UPDATE nicht erlaubt)
Die Kombination mit SCROLL ist unproblematisch
Anwendungsprogrammierschnittstelle
34
Sichtbarkeit von nderungen
ASENSITIVE CURSOR Standard Bei OPEN muss nicht zwingend eine Kopie von T erstellt werden: die
Komplexitt der Cursor-Definition verlangt jedoch oft seine Materialisierung als Kopie
Ob nderungen, die T betreffen und durch andere Cursor oder direkt erfolgen, in der momentanen Cursor-Instanziierung sichtbar werden, ist implementierungsabhngig
Falls UPDATE deklariert wird, muss eine eindeutige Abbildung der Cursor-Zeilen auf die Tabelle mglich sein (siehe aktualisierbare Sicht); es wird definitiv keine separate Kopie von T erstellt.
Anwendungsprogrammierschnittstelle
35
Erweiterte Positionierungsmglichkeiten
SCROLL-Funktion Syntax des erweiterten FETCH-Statements: EXEC SQL FETCH [ [fetch orientation] FROM ] cursor
INTO target list
fetch orientation::= NEXT | PRIOR | FIRST | LAST | ABSOLUTE | RELATIVE
Anwendungsprogrammierschnittstelle
36
Beispiele
Cursor-Definition EXEC SQL DECLARE C2 SCROLL CURSOR
FOR SELECT ...
SCROLL-Beispiele: EXEC SQL FETCH ABSOLUTE 100 FROM C2 INTO ... EXEC SQL FETCH ABSOLUTE -10 FROM C2 INTO ...
(zehntletzte Zeile) EXEC SQL FETCH RELATIVE 2 FROM C2 INTO ...
(bernchste Zeile) EXEC SQL FETCH RELATIVE -10 FROM C2 INTO ...
Anwendungsprogrammierschnittstelle
37
bersicht
Kopplung von DB- und Programmiersprache Wirtsspracheneinbettung und bersetzung Eingebettetes statisches SQL SQL/PSM Dynamisches SQL Call-Level-Interface (CLI)
Anwendungsprogrammierschnittstelle
38
SQL/PSM
SQL/PSM: Persistent Stored Modules
SQL-Standard definiert Routinen (SQL-invoked routines) Prozeduren und Funktionen Implementierung in SQL oder extern in einer Programmiersprache Aufruf erfolgt in SQL-Anweisungen hufig genutzte Bezeichnungen: stored procedures, user-defined
functions SQL-Standard definiert prozedurale Erweiterungen
Prozedurale Erweiterungsmglichkeiten der DBS-Funktionalitt aus Sicht der Anwendung
Einfhrung neuer Kontrollstrukturen, z.B. Schleifen, Bedingungen, etc.
Anwendungsprogrammierschnittstelle
39
Beispiel: SQL-Prozedur
Erzeugen einer SQL-Prozedur CREATE PROCEDURE proc1 ( )
BEGIN INSERT INTO Pers VALUES (...); INSERT INTO Abt VALUES (...); END;
Aufruf mit CALL-Anweisung . . .
EXEC SQL CALL proc1 ( ); . . .
Anwendungsprogrammierschnittstelle
40
Beispiel: SQL-Funktion
Erzeugen einer SQL-Funktion CREATE FUNCTION dm_in_euro (float v) RETURNS float BEGIN RETURN (v / 1.95583); END;
Aufruf innerhalb einer Anfrage SELECT Bezeichnung, dm_in_euro (Preis) FROM Produkt WHERE dm_in_euro (Preis) < 100
Nutzung auerhalb von Anfragen SET euro_preis = dm_in_euro (79.00);
Anwendungsprogrammierschnittstelle
41
Prozedurale Spracherweiterungen
Compound statement BEGIN ... END;
Variablendeklaration DECLARE var CHAR (6);
If statement IF subject (var urgent) THEN ... ELSE ...;
Case statement CASE subject (var) WHEN SQL THEN ... WHEN ...;
Loop statement LOOP END LOOP;
While statement WHILE i
Anwendungsprogrammierschnittstelle
42
SQL/PSM: Vorteile
Leistungsverbesserung vor allem in Client/Server-Umgebung Entwerfen von Routinen mit mehreren SQL-Anweisungen Ausfhrung mehrerer SQL-Anweisungen durch ein EXEC SQL Anzahl der Zugriffe des Anwendungsprogramms auf die DB wird
reduziert Hhere Verarbeitungsmchtigkeit des DBS
prozedurale Erweiterungen, Kontrollstrukturen vorbersetzte Ausfhrungsplne werden gespeichert und sind
wiederverwendbar Prozeduren und Funktionen als gemeinsamer Code fr
verschiedene Anwendungsprogramme nutzbar Hherer Isolationsgrad der Anwendung von der DB erlaubt reine SQL-Implementierungen komplexer Funktionen
(Sicherheitsaspekt)
Anwendungsprogrammierschnittstelle
43
bersicht
Kopplung von DB- und Programmiersprache Wirtsspracheneinbettung und bersetzung Eingebettetes statisches SQL SQL/PSM Dynamisches SQL Call-Level-Interface (CLI)
Anwendungsprogrammierschnittstelle
44
Dynamisches SQL
Festlegen/bergabe von SQL-Anweisungen erst zur Laufzeit Benutzer stellt Ad-hoc-Anfrage AP berechnet dynamisch SQL-Anweisung SQL-Anweisung ist aktueller Parameter von Funktionsaufrufen an das
DBMS
Anwendungsprogrammierschnittstelle
45
Dynamisches SQL: Eigenschaften
Vorbereitung einer SQL-Anweisung kann erst zur Laufzeit beginnen Bindung an das DB-Schema erfolgt zum sptest mglichen Zeitpunkt
DB-Operationen beziehen sich stets auf den aktuellen DB-Zustand grte Flexibilitt und Unabhngigkeit vom DB-Schema
Vorbereitung und Ausfhrung einer SQL-Anweisung erfolgt typischerweise durch Interpretation Leistungsproblem:
- wiederholte Ausfhrung derselben Anweisung - manche DBMS (z.B. DB2) bewahren Zugriffsplne zur Wiederverwendung
in einem Cache auf
bersetzung und Code-Generierung ist jedoch prinzipiell mglich!
Anwendungsprogrammierschnittstelle
46
Mehrere Sprachanstze
Eingebettetes dynamisches SQL Call-Level-Interface (CLI)
kann ODBC (Open Database Connectivity) implementieren Java Database Connectivity (JDBC)
dynamische SQL-Schnittstelle zur Verwendung mit Java de facto-Standard fr den Zugriff auf relationale Daten von Java-
Programmen aus JDBC ist gut in Java integriert und ermglicht einen Zugriff auf
relationale Datenbanken in einem objektorientierten Programmierstil JDBC ermglicht das Schreiben von Java-Applets, die von einem Web-
Browser auf eine DB zugreifen knnen
Quelle: [ME00, http://java.sun.com/products/jdbc]
Anwendungsprogrammierschnittstelle
47
Gemeinsame Anforderungen
Zugriff auf Metadaten bergabe und Abwicklung dynamisch berechneter SQL-Anweisungen Optionale Trennung von Vorbereitung und Ausfhrung
einmalige Vorbereitung mit Platzhalter (?) fr Parameter n-malige Ausfhrung
Explizite Bindung von Platzhaltern (?) an Wirtsvariable Variable sind zur Z nicht bekannt! Variablenwert wird zur Ausfhrungszeit vom Parameter bernommen
Anwendungsprogrammierschnittstelle
48
Eingebettetes Dynamisches SQL
ist im Stil statischem SQL hnlicher wird oft von Anwendungen gewhlt, die dynamische und statische SQL-
Anweisungen mischen Programme mit EDSQL sind kompakter und besser lesbar als solche
mit CLI oder JDBC untersttzt mehrere Wirtssprachen 4 wesentliche Anweisungen
DESCRIBE PREPARE EXECUTE EXECUTE IMMEDIATE
SQL-Anweisungen werden vom Compiler wie Zeichenketten behandelt Deklaration DECLARE STATEMENT Anweisungen enthalten Platzhalter fr Parameter (?) statt
Programmvariablen
Anwendungsprogrammierschnittstelle
49
Trennung von Vorbereitung und Ausfhrung
exec sql begin declare section; char Anweisung [256], X[3]; exec sql end declare section; exec sql declare SQLanw statement; Anweisung = DELETE FROM Pers WHERE Anr = ?; exec sql prepare SQLanw from :Anweisung; exec sql execute SQLanw using K51; scanf ( %s , X); exec sql execute SQLanw using :X;
Prepare-and-Execute optimiert die mehrfache Verwendung einer
dynamisch erzeugten SQL-Anweisung
Vorb
erei
tung
Au
sfh
rung
Anwendungsprogrammierschnittstelle
50
Einmalige Ausfhrung einer SQL-Anweisung
Beispiel:
scanf ( %s , Anweisung); exec sql execute immediate :Anweisung;
Anwendungsprogrammierschnittstelle
51
Cursor-Verwendung
Beispiel:
exec sql declare SQLanw statement; exec sql prepare SQLanw from SELECT Name FROM Pers WHERE Anr=?; exec sql declare C1 cursor for SQLanw; exec sql open C1 using K51; . . .
SELECT-Anweisung nicht Teil von DECLARE CURSOR, sondern Teil der PREPARE-Anweisung
OPEN-Anweisung (und FETCH) anstatt EXECUTE
Anwendungsprogrammierschnittstelle
52
Dynamische Parameterbindung
Beispiel
Anweisung = INSERT INTO Pers VALUES (?, ?, ...); exec sql prepare SQLanw from :Anweisung; vname = Ted; nname = Codd; ... exec sql execute SQLanw using :vname, :nname, ...;
Anwendungsprogrammierschnittstelle
53
Zugriff auf Beschreibungsinformation
z.B. wenn Anzahl und Typ der dynamischen Parameter nicht bekannt ist Deskriptorbereich ist eine gekapselte Datenstruktur, die durch das DBMS
verwaltet wird Beispiel:
Anweisung = INSERT INTO Pers VALUES (?, ?, ...); exec sql prepare SQLanw from :Anweisung; exec sql allocate descriptor Eingabeparameter; exec sql describe input SQLanw into sql descriptor Eingabeparameter; exec sql get descriptor Eingabeparameter :n = count; for (i = 1; i < n; i ++) { exec sql get descriptor Eingabeparameter value :i :attrtyp = type, :attrlnge = length, :attrname = name; . . . exec sql set descriptor Eingabeparameter value :i data = :d, indicator = :ind; } exec sql execute SQLanw using sql descriptor Eingabeparameter;
Anwendungsprogrammierschnittstelle
54
bersicht
Kopplung von DB- und Programmiersprache Wirtsspracheneinbettung und bersetzung Eingebettetes statisches SQL SQL/PSM Dynamisches SQL Call-Level-Interface (CLI)
Anwendungsprogrammierschnittstelle
55
Call-Level-Interface
Spezielle Form von dynamischem SQL Schnittstelle ist als Sammlung von Prozeduren/Funktionen realisiert Direkte Aufrufe der Routinen einer standardisierten Bibliothek Keine Vorbersetzung (Behandlung der DB-Anweisungen) von
Anwendungen Vorbereitung der DB-Anweisung geschieht erst beim Aufruf zur LZ Anwendungen brauchen nicht im Source-Code bereitgestellt werden Wichtig zur Realisierung von kommerzieller AW-Software bzw. Tools
wird sehr hufig in der Praxis eingesetzt!
Anwendungsprogrammierschnittstelle
56
CLI-Standardisierung
CLI-Standardisierung in SQL3 wurde vorgezogen ISO-Standard wurde 1996 verabschiedet starke Anlehnung an ODBC bzw. X/Open CLI Standard-CLI umfasst ber 40 Routinen:
Verbindungskontrolle Ressourcen-Allokation Ausfhrung von SQL-Befehlen Zugriff auf Diagnoseinformation Transaktionsklammerung, Informationsanforderung zur
Implementierung
Anwendungsprogrammierschnittstelle
57
Call-Level-Interface
Vorteile von CLI Schreiben portabler Anwendungen Systemunabhngigkeit Mehrfache Verbindungen zur selben DB Verbindungen zu mehreren DBS Optimierung des Zugriffs (durch Prepare)
Kooperation von AP und DBS maximale gegenseitige Kapselung Zusammenspiel AP/CLI und DBVS ist nicht durch bersetzungsphase
vorbereitet Wahl des DBS zur Laufzeit vielfltige LZ-Abstimmungen erforderlich
Anwendungsprogrammierschnittstelle
58
Konzept der Handle-Variablen
Handle (internes Kennzeichen) ist letztlich eine Programmvariable, die Informationen reprsentiert, die fr ein AP durch die CLI-Implementierung verwaltet wird
gestattet Austausch von Verarbeitungsinformationen Arten:
Umgebungskennung reprsentiert den globalen Zustand der Applikation Verbindungskennung
- separate Kennung: n Verbindungen zu einem oder mehreren DBS - Freigabe/Rcksetzen von Transaktionen, Isolationsgrad
Anweisungskennung - mehrfache Definition, auch mehrfache Nutzung - Ausfhrungszustand einer SQL-Anweisung; sie fasst Informationen
zusammen, die bei statischem SQL in SQLCA, SQLDA und Cursorn stehen Deskriptorkennung enthlt Informationen, wie Daten einer SQL-Anweisung
zwischen DBS und CLI-Programm ausgetauscht werden
Anwendungsprogrammierschnittstelle
59
#include sqlcli.h#include . . .{SQLCHAR * server;SQLCHAR * uid;SQLCHAR * pwd;HENV henv; // environment handleHDBC hdbc; // connection handleHSTMT hstmt; // statement handleSQLINTEGER id;SQLCHAR name [51];
/* connect to database */SQLAllocEnv (&henv);SQLAllocConnect (henv, &hdbc) ;if (SQLConnect (hdbc, server, uid,
pwd, ...) != SQL_SUCCESS)return (print_err (hdbc, ...) ) ;
/* create a table */SQLAllocStmt (hdbc, &hstmt) ;{ SQLCHAR create [ ] = CREATE TABLE
NameID (ID integer,Name varchar (50) ) ;
if (SQLExecDirect (hstmt, create, ...)!= SQL_SUCCESS)return (print_err (hdbc, hstmt) ) ;
}/* commit transaction */SQLTransact (henv, hdbc, SQL_COMMIT);
/* insert row */{ SQLCHAR insert [ ] = INSERT INTO
NameID VALUES (?, ?) ;if (SQLPrepare (hstmt, insert, ...) !=
SQL_SUCCESS)return (print_err (hdbc, hstmt) ) ;
SQLBindParam (hstmt, 1, ..., id, ...) ;SQLBindParam (hstmt, 2, ..., name,
...) ;id = 500; strcpy (name, Schmidt) ;
if (SQLExecute (hstmt) != SQL_SUCCESS)return (print_err (hdbc, hstmt) ) ; }
/* commit transaction */SQLTransact (henv, hdbc, SQL_COMMIT) ;}
CLI-Beispiel:
Anwendungsprogrammierschnittstelle
60
JDBC
JDBC: Java Database Connectivity JDBC wurde wesentlich beeinflusst durch andere CALL-Schnittstellen, wie
ODBC und SQL/CLI. JDBC bietet Methoden, um die Verbindung zu einer DB aufzubauen, ad-
hoc SQL-Anweisungen auszufhren und deren Ergebnis zu verarbeiten. JDBC ist in verschiedensten Java-Anwendungen einsetzbar:
Java Applications Java Applets Servlets, JSPs ...
Anwendungsprogrammierschnittstelle
61
JDBC: Beispiel (1 of 6)
import java.sql.*; (1) class DB2Appl { static { try {Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance(); (2) } catch (Exception e) { System.out.println(e);} } public static void main(String argv[]) { Connection con = null; (3) String url = "jdbc:db2:sample"; (4) try { if (argv.length == 0) { con = DriverManager.getConnection(url);} else if (argv.length == 2) { String userid = argv[0]; String passwd = argv[1]; con = DriverManager.getConnection(url, userid, passwd);} (5) else { System out println("Usage: java DB2Appl[username password]");
Anwendungsprogrammierschnittstelle
62
JDBC: Beispiel (2 of 6)
System.out.println("Retrieve some data from the database..."); Statement stmt = con.createStatement(); (6) String stmtText = "SELECT projectno, manager FROM projects"; ResultSet rs = stmt.executeQuery(stmtText); (7) System.out.println("Received results:"); while (rs.next()) { (8) String pno = rs.getString(1); (9) String man = rs.getString("manager"); System.out.print(" Project = " + pno); System.out.print(" Manager = " + man); System.out.print("");} rs.close(); stmt.close();
Anwendungsprogrammierschnittstelle
63
System.out.println("Update the database... "); stmt = con.createStatement(); stmtText = "UPDATE projects SET budget = 10 000 000 WHERE projectno = 'PJ47'"; int rowsUpdated = stmt.executeUpdate(stmtText); (10) System.out.print("Changed "+rowsUpdated); if (1 == rowsUpdated) System.out.println(" row."); else System.out.println(" rows."); stmt.close(); con.close(); (11) } catch( Exception e ) { System.out.println(e);} } }
JDBC: Beispiel (3 of 6)
Anwendungsprogrammierschnittstelle
64
JDBC: Beispiel (4 of 6)
(1) JDBC Packages importieren: Das JDBC Package muss die Klasse java.sql.DriverManager verfgbar
machen. (2) Passenden JDBC Driver laden:
Com.ibm.db2.jdbc.net.DB2Driver fr DB2-Applets Com.ibm.db2.jdbc.app.DB2Driver fr DB2-Anwendungen
(3) Connection-Object: Connection-Objekt ist notwendig zur Verwaltung der Verbindung zur DB.
(4) URL fr die DB festlegen: Allgemeine Form: jdbc:: Fr DB2-Applet-Treiber: jdbc:db2://server_name:port/database_name Fr DB2-Anwendungs-Treiber: jdbc:db2:database_name.
Anwendungsprogrammierschnittstelle
65
JDBC: Beispiel (5 of 6)
(5) Verbindung zur DB: DriverManager.getConnection() Unterschiedliche Parameter sind mglich: getConnection(String url)
- Baut eine Verbindung zur angegebenen DB (url) auf, wobei der Standardbenutzer verwendet wird.
getConnection(String url, String userid, String password) - Baut eine Verbindung zur angegebenen DB (url) auf, wobei Benutzer und Passwort
explizit angegeben werden.
(6) Statement-Objekt: Bietet Methoden zur Ausfhrung von SQL-Anweisungen.
(7) Anfrageergebnis abfragen: Methode executeQuery(String) ermglicht die Ausfhrung von SQL-
Anweisungen, die eine Ergebnismenge liefern. Ergebnismenge muss einem ResultSet-Objekt zugewiesen werden. Das ResultSet-Objekt ermglicht den Zugriff auf Metadaten zur Anfrage sowie
den Zugriff auf das Anfrageergebnis.
Anwendungsprogrammierschnittstelle
66
JDBC: Beispiel (6 of 6)
(8) Zugriff auf die Zeilen der Ergebnismenge: Das ResultSet-Objekt bietet Cursor-Funktionalitt fr den Zugriff auf die
Ergebnismenge. Die Methode ResultSet.next() liefert jeweils die nchste Zeile oder false, falls das Ende der Ergebnismenge erreicht ist.
In JDBC 2.0 wird die erweiterte Cursor-Funktionalitt (SCROLL CURSOR), wie sie der SQL-Standard definiert, untersttzt.
(9) Zugriff auf den Wert einer Spalte: ResultSet.getString(int n) liefert den Wert in Spalte n der aktuellen Zeile. ResultSet.getString(String name) liefert den Wert der ber den Spaltennamen
identifizierten Spalte. Weitere get-Methoden erlauben den Zugriff auf Spalten anderer Typen.
(10) UPDATE-Anweisungen ausfhren: Die Methode executeUpdate(String) erlaubt die Ausfhrung von
INSERT/UPDATE/DELETE. Als Ergebnis wird die Anzahl genderter Zeilen geliefert.
(11) Verbindung schlieen
Anwendungsprogrammierschnittstelle
67
JDBC: Metadaten
ResultSet-Objekte stellen die Metadaten zu einer Anfrage bereit: Anzahl der Spalten in der Ergebnismenge Name und Typ fr jede Spalte Notwendiger Platz zur Darstellung der Werte der Spalte
Beispiel: ...
ResultSet rs = stmt.executeQuery("SELECT * from projects"); ResultSetMetaData rsm = rs.getMetaData(); // gibt Metadaten fr jede Spalte aus for (int i=1; i
Anwendungsprogrammierschnittstelle
68
Zusammenfassung
Cursor-Konzept zur satzweisen Verarbeitung von Datenmengen Anpassung von mengenorientierter Bereitstellung und
satz-weiser Verarbeitung von DBS-Ergebnissen Operationen: DECLARE CURSOR, OPEN, FETCH, CLOSE Erweiterungen: Scroll-Cursor, Sichtbarkeit von nderungen
Statisches (eingebettetes) SQL hohe Effizienz, gesamte Typprfung und Konvertierung erfolgen durch
Precompiler relativ einfache Programmierung Aufbau aller SQL-Befehle muss zur bersetzungszeit festliegen es knnen zur Laufzeit nicht verschiedene Datenbanken dynamisch
angesprochen werden
Anwendungsprogrammierschnittstelle
69
Zusammenfassung
Interpretation einer DB-Anweisung allgemeines Programm (Interpreter) akzeptiert Anweisungen der DB-
Sprache als Eingabe und erzeugt mit Hilfe von Aufrufen des Zugriffssystems Ergebnis
hoher Aufwand zur Laufzeit (v.a. bei wiederholter Ausfhrung einer Anweisung)
bersetzung, Code-Erzeugung und Ausfhrung einer DB-Anweisung fr jede DB-Anweisung wird ein zugeschnittenes Programm erzeugt
(bersetzungszeit), das zur Laufzeit abgewickelt wird und dabei mit Hilfe von Aufrufen des Zugriffssystems das Ergebnis ableitet
bersetzungsaufwand wird zur Laufzeit soweit wie mglich vermieden PSM
zielt ab auf Leistungsverbesserung, vor allem in Client/Server-Umgebung
erhht die Verarbeitungsmchtigkeit des DBS
Anwendungsprogrammierschnittstelle
70
Zusammenfassung
Dynamisches SQL Festlegung/bergabe von SQL-Anweisungen zur Laufzeit hohe Flexibilitt, schwierige(re) Programmierung Unterschiede zu statischem, eingebettetem SQL
- explizite Anweisungen zur Datenabbildung zwischen DBS und Programmvariablen
- klare Trennung zwischen Anwendungsprogramm und SQL ( einfacheres Debugging)
CLI Schnittstelle ist als Sammlung von Prozeduren/Funktionen realisiert Keine Vorbersetzung oder Vorbereitung
- Anwendungen brauchen nicht im Source-Code bereitgestellt werden - Wichtig zur Realisierung von kommerzieller AW-Software bzw. Tools
Anwendungsprogrammierschnittstelle
71
Zusammenfassung
JDBC bietet Schnittstelle fr den Zugriff auf (objekt-) relationale DBS
aus Java-Anwendungen vermeidet einige syntaktische Mngel (Lesbarkeit,
Fehleranflligkeit) von CLI SQLJ (ergnzende Information)
eingebettete Sprache fr statische Java-Programme zielt auf verbesserte Laufzeiteffizienz im Vergleich zu JDBC ab,
Syntax- und Semantikprfung zur bersetzungszeit grere Unabhngigkeit von verschiedenen SQL-Dialekten
Anwendungsprogrammierschnittstelle
72
Ergnzende Literatur zu diesem Kapitel
[HC99] A. L. Hosking, J. Chen: PM3: An Orthogonally Persistent Systems Programming Language Design, Implementation, Performance. VLDB, 1999.
[MBC+94] R. Morrison, A.L. Brown, R.C.H. Connor, Q.I. Cutts, A. Dearle, G.N.C. Kirby, D.S. Munro: The Napier88 Reference Manual (Release 2.0) University of St Andrews Technical Report CS/94/8 (1994).
[ME00] J. Melton, A. Eisenberg: Understanding SQL and Java Together. Morgan Kaufmann, 2000.
Datenbanken und InformationssystemebersichtKopplungCall-Schnittstelle (Aufruftechnik)SQL-EinbettungIntegrationsanstzeRelationale APIsbersichtWirtsspracheneinbettung und bersetzungVon der bersetzung bis zur AusfhrungVon der bersetzung bis zur AusfhrungVon der bersetzung bis zur AusfhrungVon der bersetzung bis zur AusfhrungAuswertungstechnikWahl des BindezeitpunktsWahl des BindezeitpunktsAuswertungstechnik und BindezeitpunktbersichtEingebettetes statisches SQL: BeispielEingebettetes statisches SQLCursor-KonzeptCursor-KonzeptCursor-KonzeptCursor: BeispielAktualisierungSQL-ProgrammiermodellSQL-ProgrammiermodellBeispiel: StcklistenauflsungBeispiel: StcklistenauflsungBeispiel: StcklistenauflsungBeispiel: StcklistenauflsungErweiterungen zum Cursor-KonzeptSichtbarkeit von nderungenSichtbarkeit von nderungenErweiterte PositionierungsmglichkeitenBeispielebersichtSQL/PSM Beispiel: SQL-ProzedurBeispiel: SQL-FunktionProzedurale SpracherweiterungenSQL/PSM: VorteilebersichtDynamisches SQLDynamisches SQL: EigenschaftenMehrere Sprachanstze Gemeinsame AnforderungenEingebettetes Dynamisches SQL Trennung von Vorbereitung und AusfhrungEinmalige Ausfhrung einer SQL-AnweisungCursor-VerwendungDynamische ParameterbindungZugriff auf Beschreibungsinformation bersichtCall-Level-InterfaceCLI-StandardisierungCall-Level-InterfaceKonzept der Handle-VariablenSlide Number 59JDBCJDBC: Beispiel (1 of 6)JDBC: Beispiel (2 of 6)JDBC: Beispiel (3 of 6)JDBC: Beispiel (4 of 6)JDBC: Beispiel (5 of 6)JDBC: Beispiel (6 of 6)JDBC: MetadatenZusammenfassungZusammenfassungZusammenfassungZusammenfassungErgnzende Literatur zu diesem Kapitel