Sie sind auf Seite 1von 72

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

bersicht

Kopplung von DB- und Programmiersprache


Wirtsspracheneinbettung und bersetzung
Eingebettetes statisches SQL
SQL/PSM
Dynamisches SQL
Call-Level-Interface (CLI)

Anwendungsprogrammierschnittstelle

Kopplung
bersicht
Kopplung

CALL-Schnittstelle
(Call Level Interface CLI)
SQL-Einbettung
Integrierte Sprachen/Spracherweiterungen
persistente Programmiersprachen
DB-Programmiersprachen
statisch

dynamisch

Anwendungsprogrammierschnittstelle

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

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

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

Relationale APIs
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
7

Anwendungsprogrammierschnittstelle

bersicht

Kopplung von DB- und Programmiersprache


Wirtsspracheneinbettung und bersetzung
Eingebettetes statisches SQL
SQL/PSM
Dynamisches SQL
Call-Level-Interface (CLI)

Anwendungsprogrammierschnittstelle

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 DBSspezifischen Vorkehrungen bei
der AP-bersetzung erforderlich!

SQL-Einbettung
syntaktische Unterscheidung
zwischen Programm- und DBAnweisungen
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
9

Anwendungsprogrammierschnittstelle

Von der bersetzung bis zur Ausfhrung


Embedded-SQLProgramm
z.B. in C

Programmbibliothek
SQL-Precompiler
Datenbankkatalog

C-Programm
C + DBS-Aufrufe

WirtssprachenCompiler C

Programmteil in
Maschinencode

Zugriffsmodul
Linker

Ausfhrbares Progr.
Lademodul

Loader
10

Anwendungsprogrammierschnittstelle

Von der bersetzung bis zur Ausfhrung

Embedded-SQLProgramm
z.B. in C

SQL-Precompiler
Datenbankkatalog

C-Programm
C + DBS-Aufrufe

Zugriffsmodul

Vorbersetzung des AP
Entfernung aller Embedded-SQLAnweisungen 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 DBKatalog
11

Anwendungsprogrammierschnittstelle

Von der bersetzung bis zur Ausfhrung


C-Programm
C + DBS-Aufrufe

WirtssprachenCompiler C

Programmbibliothek
Programmteil in
Maschinencode

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
12

Anwendungsprogrammierschnittstelle

Von der bersetzung bis zur Ausfhrung

Programmbibliothek
Programmteil in
Maschinencode

Linker

Zugriffsmodul

Ausfhrbares Progr.
Lademodul

Loader

Linker
Zusammenfgen der
Objektmodule zu lauffhigem
Programm
Hinzufgen des SQLLaufzeitsystems
Loader
Laden des ausfhrbaren
Programms in den Speicher
Anbinden des Zugriffsmoduls
aus DB-Katalog und
automatische berprfung
seiner Gltigkeit
Programmstart
13

Anwendungsprogrammierschnittstelle

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

14

Anwendungsprogrammierschnittstelle

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:
Select
From
Where

Pnr, Name, Gehalt


Pers
Beruf = Programmierer

DB-Katalog:
SYSREL:

SYSATTR:
SYSINDEX:
SYSAUTH:
SYSINT/RULES:

Tabellenbeschreibungen:
Pers, . . .
Attributbeschreibungen:
Pnr, Name, Gehalt, . . .
IPers(Beruf), . . .
Nutzungsrechte
Integrittsbedingungen,
Zusicherungen, . . .

15

Anwendungsprogrammierschnittstelle

Wahl des Bindezeitpunkts


Zeitpunkt des Bindens
bersetzungszeit (Z)

AP

bersetzungskosten:
unerheblich fr Antwortzeit (AZ)

Zugriffe (zur LZ):


effizient

datenabhngig!

Laufzeit (LZ)

Interpretation:
erheblich fr AZ

Ausgleich
gesucht!

Invalidierung
durch Schemanderungen

Zugriffe (zur LZ):


teuer

datenunabhngig!

16

Anwendungsprogrammierschnittstelle

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

17

Anwendungsprogrammierschnittstelle

bersicht

Kopplung von DB- und Programmiersprache


Wirtsspracheneinbettung und bersetzung
Eingebettetes statisches SQL
SQL/PSM
Dynamisches SQL
Call-Level-Interface (CLI)

18

Anwendungsprogrammierschnittstelle

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;
}
19

Anwendungsprogrammierschnittstelle

Eingebettetes statisches SQL


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

20

Anwendungsprogrammierschnittstelle

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 DECLARE cursor CURSOR FOR table-exp
[ORDER BY order-item-commalist]

Beispiel

DECLARE C1 CURSOR FOR


SELECT Name, Gehalt, Anr FROM Pers
WHERE Anr = K55 ORDER BY Name;
21

Anwendungsprogrammierschnittstelle

Cursor-Konzept
Cursor-Operationen
OPEN C1
FETCH C1 INTO Var1, Var2, Var3
CLOSE C1

1. Anfrage: OPEN C1

AWP in satzorientierter
Programmiersprache

3. Zeile sequentiell
holen und
verarbeiten
(FETCH C1)

4. Cursor schlieen
(CLOSE C1)
2. Anfrage auswerten,
Ergebniszeile(n) im
Cursor bereitstellen
mengenorientiertes
DBS

22

Anwendungsprogrammierschnittstelle

Cursor-Konzept
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, ...)

23

Anwendungsprogrammierschnittstelle

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;

24

Anwendungsprogrammierschnittstelle

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
positioned-update ::= UPDATE table SET update-assignment-commalist
WHERE CURRENT OF cursor
positioned-delete ::= DELETE FROM table
WHERE CURRENT OF cursor

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; }
25

Anwendungsprogrammierschnittstelle

SQL-Programmiermodell
1. 1 Cursor

C1

2. Mehrere Cursor

Verknpfung der
Zeilen im
Programm

C1

3. Positionsbezogene Aktualisierung

C2

C3

C1

INTO

Variable

Update, Delete

26

Anwendungsprogrammierschnittstelle

SQL-Programmiermodell
4. Abhngige Cursor

C1

Wert 11

Wert1

C3

C2
Wert12

C3

Wert2
Wert13

C2

..
.

C3

Wert
. 21

..

27

Anwendungsprogrammierschnittstelle

Beispiel: Stcklistenauflsung
Tabelle Struktur (Otnr, Utnr, Anzahl)
Aufgabe: Ausgabe aller Endprodukte sowie deren Komponenten
max. Schachtelungstiefe sei bekannt (hier: 2)

Struktur (Otnr,

Tragflche
5

Verstrebung 100

Querruder
5

10
Niete

Fahrwerk

2
Scharnier

Utnr,

Anzahl)

100

10

28

Anwendungsprogrammierschnittstelle

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;
...
29

Anwendungsprogrammierschnittstelle

Beispiel: Stcklistenauflsung
...
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;
30

Anwendungsprogrammierschnittstelle

Beispiel: Stcklistenauflsung
Ausgabe:
T

V: 5

N: 10
N: 100
Q: 1
N: 5
S: 2
F: 1
N: 8
S: 3

Tragflche
5

Verstrebung 100

Querruder
5

10
Niete

Fahrwerk

Scharnier

31

Anwendungsprogrammierschnittstelle

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]}]

32

Anwendungsprogrammierschnittstelle

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

33

Anwendungsprogrammierschnittstelle

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.

34

Anwendungsprogrammierschnittstelle

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 <expression> |
RELATIVE <expression>

35

Anwendungsprogrammierschnittstelle

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 ...

36

Anwendungsprogrammierschnittstelle

bersicht

Kopplung von DB- und Programmiersprache


Wirtsspracheneinbettung und bersetzung
Eingebettetes statisches SQL
SQL/PSM
Dynamisches SQL
Call-Level-Interface (CLI)

37

Anwendungsprogrammierschnittstelle

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.

38

Anwendungsprogrammierschnittstelle

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 ( );
...

39

Anwendungsprogrammierschnittstelle

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);
40

Anwendungsprogrammierschnittstelle

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 <SQL statement list> END LOOP;

While statement

WHILE i<100 DO ... END WHILE;

Repeat statement

REPEAT ... UNTIL i<100 END REPEAT;

For statement

FOR result AS ... DO ... END FOR;

Leave statement

LEAVE ...;

Return statement

RETURN urgent;

Call statement

CALL procedure_x (1,3,5);

Assignment statement

SET x = abc;

Signal/resignal statement

SIGNAL divison_by_zero

41

Anwendungsprogrammierschnittstelle

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)
42

Anwendungsprogrammierschnittstelle

bersicht

Kopplung von DB- und Programmiersprache


Wirtsspracheneinbettung und bersetzung
Eingebettetes statisches SQL
SQL/PSM
Dynamisches SQL
Call-Level-Interface (CLI)

43

Anwendungsprogrammierschnittstelle

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

44

Anwendungsprogrammierschnittstelle

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!

45

Anwendungsprogrammierschnittstelle

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 JavaProgrammen 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 WebBrowser auf eine DB zugreifen knnen

Quelle: [ME00, http://java.sun.com/products/jdbc]

46

Anwendungsprogrammierschnittstelle

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

47

Anwendungsprogrammierschnittstelle

Eingebettetes Dynamisches SQL


ist im Stil statischem SQL hnlicher
wird oft von Anwendungen gewhlt, die dynamische und statische SQLAnweisungen 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
48

Anwendungsprogrammierschnittstelle

Trennung von Vorbereitung und Ausfhrung


Prepare-and-Execute optimiert die

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;

Vorbereitung

mehrfache Verwendung einer


dynamisch erzeugten SQLAnweisung

Ausfhrung

exec sql begin declare section;


char
Anweisung [256], X[3];
exec sql end declare section;

49

Anwendungsprogrammierschnittstelle

Einmalige Ausfhrung einer SQL-Anweisung


Beispiel:
scanf ( %s , Anweisung);
exec sql execute immediate :Anweisung;

50

Anwendungsprogrammierschnittstelle

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

51

Anwendungsprogrammierschnittstelle

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, ...;

52

Anwendungsprogrammierschnittstelle

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;
53

Anwendungsprogrammierschnittstelle

bersicht

Kopplung von DB- und Programmiersprache


Wirtsspracheneinbettung und bersetzung
Eingebettetes statisches SQL
SQL/PSM
Dynamisches SQL
Call-Level-Interface (CLI)

54

Anwendungsprogrammierschnittstelle

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!

55

Anwendungsprogrammierschnittstelle

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

56

Anwendungsprogrammierschnittstelle

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

57

Anwendungsprogrammierschnittstelle

Konzept der Handle-Variablen


Handle (internes Kennzeichen) ist letztlich eine Programmvariable, die
Informationen reprsentiert, die fr ein AP durch die CLIImplementierung 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
58

Anwendungsprogrammierschnittstelle

CLI-Beispiel:

#include sqlcli.h

if (SQLExecDirect (hstmt, create, ...)

#include <string.h>

!= SQL_SUCCESS)

...

return (print_err (hdbc, hstmt) ) ;

SQLCHAR * server;

/* commit transaction */

SQLCHAR * uid;

SQLTransact (henv, hdbc, SQL_COMMIT);

SQLCHAR * pwd;
HENV henv; // environment handle

/* insert row */

HDBC hdbc; // connection handle

{ SQLCHAR insert [ ] = INSERT INTO


NameID VALUES (?, ?) ;

HSTMT hstmt; // statement handle


SQLINTEGER id;

if (SQLPrepare (hstmt, insert, ...) !=


SQL_SUCCESS)

SQLCHAR name [51];

return (print_err (hdbc, hstmt) ) ;

/* connect to database */
SQLAllocEnv (&henv);

SQLBindParam (hstmt, 1, ..., id, ...) ;

SQLAllocConnect (henv, &hdbc) ;

SQLBindParam (hstmt, 2, ..., name,


...) ;

if (SQLConnect (hdbc, server, uid,


pwd, ...) != SQL_SUCCESS)

id = 500; strcpy (name, Schmidt) ;

return (print_err (hdbc, ...) ) ;


/* create a table */

if (SQLExecute (hstmt) != SQL_SUCCESS)


return (print_err (hdbc, hstmt) ) ; }

SQLAllocStmt (hdbc, &hstmt) ;


{ SQLCHAR create [ ] = CREATE TABLE

/* commit transaction */

NameID (ID integer,

SQLTransact (henv, hdbc, SQL_COMMIT) ;

Name varchar (50) ) ;

}
59

Anwendungsprogrammierschnittstelle

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, adhoc SQL-Anweisungen auszufhren und deren Ergebnis zu verarbeiten.
JDBC ist in verschiedensten Java-Anwendungen einsetzbar:
Java Applications
Java Applets
Servlets, JSPs
...

60

Anwendungsprogrammierschnittstelle

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 {

61

Anwendungsprogrammierschnittstelle

JDBC: Beispiel (2 of 6)

System.out.println("Retrieve some data from the database...");


Statement stmt = con.createStatement();
String stmtText = "SELECT projectno, manager FROM projects";
ResultSet rs = stmt.executeQuery(stmtText);
System.out.println("Received results:");
while (rs.next()) {
String pno = rs.getString(1);
String man = rs.getString("manager");
System.out.print(" Project = " + pno);
System.out.print(" Manager = " + man);
System.out.print("");}
rs.close();
stmt.close();

(6)
(7)
(8)
(9)

62

Anwendungsprogrammierschnittstelle

JDBC: Beispiel (3 of 6)

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);

System.out.print("Changed "+rowsUpdated);
if (1 == rowsUpdated)
System.out.println(" row.");
else
System.out.println(" rows.");
stmt.close();
con.close();
} catch( Exception e ) { System.out.println(e);}
}

(10)

(11)

63

Anwendungsprogrammierschnittstelle

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:<subprotocol>:<subname>
Fr DB2-Applet-Treiber: jdbc:db2://server_name:port/database_name
Fr DB2-Anwendungs-Treiber: jdbc:db2:database_name.

64

Anwendungsprogrammierschnittstelle

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 SQLAnweisungen, 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.
65

Anwendungsprogrammierschnittstelle

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
66

Anwendungsprogrammierschnittstelle

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<= rsm.getColumnCount(); i++) {
println( "(" + i + ") "
+ rsm.getColumnName(i);
println( " Type =
" + rsm.getColumnTypeName(i);
println( " Display Size = " + rsm.getColumnDisplaySize(i);
}
...
67

Anwendungsprogrammierschnittstelle

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

68

Anwendungsprogrammierschnittstelle

Zusammenfassung
Interpretation einer DB-Anweisung
allgemeines Programm (Interpreter) akzeptiert Anweisungen der DBSprache 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/ServerUmgebung
erhht die Verarbeitungsmchtigkeit des DBS
69

Anwendungsprogrammierschnittstelle

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

70

Anwendungsprogrammierschnittstelle

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

71

Anwendungsprogrammierschnittstelle

Ergnzende Literatur zu diesem Kapitel


[HC99]

[MBC+94]

[ME00]

A. L. Hosking, J. Chen: PM3: An Orthogonally Persistent


Systems Programming Language Design, Implementation,
Performance. VLDB, 1999.
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).
J. Melton, A. Eisenberg: Understanding SQL and Java Together.
Morgan Kaufmann, 2000.

72