72
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. Härder am Fachbereich Informatik der Universität Kaiserslautern und Prof. Dr. N. Ritter am Fachbereich Informatik der Universität Hamburg. Für dieses Skriptum verbleiben alle Rechte (insbesondere für Nachdruck) bei den Autoren.

chapter01.pdf

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