Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Sprachschnittstellen von Datenbanksystemen

Ähnliche Präsentationen


Präsentation zum Thema: "Sprachschnittstellen von Datenbanksystemen"—  Präsentation transkript:

1 Sprachschnittstellen von Datenbanksystemen
Prof. Klaus Gremminger Fachhochschule Karlsruhe Fachbereich Informatik Moltkestraße 30 76133 Karlsruhe

2 Inhalt Structured Query Language2 (SQL92)
Java Database Connectivity (JDBC) Einbettung von SQL in Java (SQLJ) Structured Query Language3 (SQL99) Die Datenbankprache SQL (Structured Query Language) ist der bedeutendste Standard in der Datenbankwelt. Der akttuelle Version ist SQL-92, manchmal auch kruz SQL2 genannt. SQL3 ist das aktuelle Normungsprojekt der ISO als Weiterentwicklung von SQL-92. SQL3 fügt etliche neue Konstrukte, insbesondere die objektorientierten Erweiterungen dem bisherigen Standard hinzu. Obgleich der SQL3-Standard mehr als 1000 Seiten umfaßt, wirkt er bereits jetzt seriöser als der ODMG-Standard. Die ODMG-OQL (Object Query Language) ist eine Anfragesprache, die auf dem select-from-where-Block von SQL-92 aufbaut. Zusätzlich kann man mit OQL in Anfragen komplexe Werte, Objektidentitäten, Pfadausdrücke über Komponentenobjekte hinweg, Methoden und sogar das Overriding von Methoden ausnutzen sowie nicht nur auf Mengen, sondern auf jeder Kollektion in der gleichen Weise arbeiten.

3 Historie SEQUEL als Anfragesprache des Prototyps System R der Firma IBM (Structured English Query Language) 1981: SQL/Data System als kommerzielles System Heute weit verbreitet IBM, Microsoft, Oracle, Sybase Wachsende Popularität erforderte Standardisierung 1986: ISO-SQL1 (auch SQL86 genannt) 1989: Addendum-1 SQL89 1992: ISO-SQL92 (auch SQL2 genannt, ISO 9075) 2000: SQL99 (ISO 9085)

4 Implementierungsmethoden
Direktes SQL Ausführen von SQL-Anweisungen von einem interaktiven Terminal aus Modulsprache Beschreibung von SQL-Anweisungen in reinem SQL in Form getrennt übersetztem Modul Call Language Interface (CLI) Aufruf von SQL-Anweisungen der SQL-Implementierung, welche wiederum das DBS mittels dynamischem SQL aufrufen Embedded SQL Einbettung von SQL-Anweisungen in Hostsprache mit Vorübersetzung (Pre-Compiler)

5 Structured Query Language2 (SQL92)
Bestandteile der Sprache Datendefinition (DDL) Datenmanipulation (DML) Datenkontrolle (DCL) Die weiteren Ausführungen basieren auf SQL92. Neu: Zusätzliche Datentypen Auf-/Abbau von Client-Server-Verbindungen Unterstützung von dynamischem SQL Scrollbare Cursor Outer-Joins Intersect- und Minus-Mengenoperationen Die primäre Funktion der Sprache SQL besteht in der Unterstützung der Definition, Manipulation und Kontrolle von Daten in SQL-Datenbanken. Eine SQL-Datenbank ist eine Datenbank, die vom Benutzer als eine Sammlung von Tabellen wahrgenommen wird; eine Tabelle besteht wiederum aus einer oder mehreren Spalten und null oder mehreren Zeilen, von denen jede Zeile einen Skalarwert für jede Spalte beinhaltet. SQL-Anweisungen im allgemeinen und solche zur Datenmanipulation im besonderen können entweder interaktiv oder aus einer Anwendung heraus aufgerufen werden. Der direkte Aufruf (interactive invocation) bedeutet, daß die fragliche Anweisung von einer Benutzeroberfläche aus aufgerufen wird. Werden durch die Anweisung Daten abgerufen, so werden sie in der Benutzeroberfläche angezeigt. Aufruf aus einer Anwendung heraus bedeutet, daß während der Ausführung eines Programmes die Anweisung aufgerufen wird. Werden durch die Anweisung Daten abgerufen, so werden sie in einen Eingabebereich innerhalb dieses Programmes geholt. Die Sprache, in der das Anwendungsprogramm geschrieben wird, heißt Hostsprache.

6 Datentypen integer (oder auch integer4) smallint (oder auch integer2)
numeric(p,q) float(p) character(n), character varying(n) oder varchar(n) bit(n), bit varying(n) date, time, timestamp blob (raw), clob (binary oder character large object)

7 Datendefinition Schemadefinition Tabellendefinition
Integritätsbedingungen Sichten

8 Schemadefinition SQL-Objekte können u.a. sein Domain-, Tabellen-,View-, Rechte-, Bedingungs-Definition Benannte Sammlung von SQL-Objekten innerhalb eines Katalogs heißt Schema Benannte Sammlung von SQL-Schemata innerhalb einer SQL-Umgebung heißt Katalog CREATE SCHEMA [schema-name] [AUTHORIZATION user-name] [DEFAULT CHARACTER SET character-set] [list-of-schema-objects]

9 Tabellendefinition Anlegen einer neuen Tabelle: CREATE TABLE Professoren (PersNr INTEGER NOT NULL, Name VARCHAR(10) NOT NULL, Rang CHAR(2) ); Hinzufügen neuer Spalten: ALTER TABLE Professoren ADD (Raum INTEGER); Verändern des Wertebereichs einer Spalte: ALTER TABLE Professoren MODIFY (Name VARCHAR(20));

10 Integritätsbedingungen
Attribut-Bedingung: UNIQUE, NOT UNIQUE Primärschlüssel-Definition CREATE TABLE Studenten (MatrNr INTEGER PRIMARY KEY...); CREATE TABLE hören (MatrNr ..., VorlNr ..., PRIMARY KEY(MatrNr, VorlNr)); Fremdschlüssel-Definition gelesenVon REFERENCES Professoren ON DELETE SET NULL CONSTRAINT Ticket_fk FOREIGN KEY(Nation, PassNr) REF... Check-Klausel CREATE TABLE prüfen ... Note NUMBER(2,1) CHECK(Note BETWEEN 0.7 AND 5.0),

11 Sichten Virtuelle Tabellen Berechnung der „Tupel“ zur Laufzeit
Zur Anpassung an spezielle Benutzerbedürfnisse und zum Datenschutz Zum Verbergen von komplexen Datenstrukturen (z.B. Primär-Fremdschlüssel-Beziehungen) Beispiel: CREATE VIEW Prüfungen AS SELECT MatrNr, VorlNr, PersNr FROM prüfen; SELECT * FROM Prüfungen;

12 Datenmanipulation Einfügen von Zeilen: INSERT INTO Professoren VALUES(1,‘Gremminger‘,‘C3‘,309); INSERT INTO Professoren (Name, PersNr) VALUES (‘Gmeiner‘,2); Verändern von Zeilen: UPDATE Professoren SET Rang = ‘C3‘ WHERE Name = ‘Gremminger‘; Löschen von Zeilen: DELETE FROM Vorlesungen; DELETE FROM Vorlesungen WHERE gelesenVon = 1;

13 Die SELECT-Anweisung Erstellt eine Ergebnismenge in Form einer Tabelle
Select [All | Distinct] {(Pseudo-) Spaltenliste | *} [Spaltenalias] From Tabellenliste [Tabellenalias] [Where Bedingungen auf Zeilen] [Group By Gruppen] [Having Bedingungen auf Gruppen] [{Union | Intersect | Minus} Abfrage] [Order By Sortierspalten] Abarbeitung Bilde das kartesische Produkt der Tabellen in der From-Klausel Wähle hieraus die Spalten der Tupel aus, die in der Select-Klausel aufgeführt sind

14 Operatoren und (Aggregat-) Funktionen
Arithmetische Operatoren: +,-,*./ Zeichenketten-Operatoren: || Funktionen to_number, to_char, to_date nvl, decode count, distinct, max, min, sum, avg Beispiele: SELECT Nation || PassNr FROM FlugGast; SELECT COUNT(DISTINCT name) FROM Stadt;

15 WHERE-Klausel Auswahlbedingungen auf Zeilen Vergleichsoperatoren
=,<>,>,,>=,<= LIKE BETWEEN AND [NOT] IN IS [NOT] NULL Beispiele: ... WHERE FlzTypus = ‘747‘ OR Hersteller LIKE ‘B%‘ ... WHERE FlugGes IN (‘LH‘, ‘BA‘,‘TA‘);

16 ORDER BY-Klausel Geordnete Anzeige der Anfrageergebnisse Beispiele:
SELECT PLZ, Name, Einwohner FROM Stadt ORDER BY PLZ ASC; SELECT Semester, Name, Anschrift FROM Student ORDER BY Semester DESC, Name ASC;

17 GROUP BY-Klausel Zusammenfassung von Tupeln, welche in einer ausgewählten Attributkombination den gleichen Wert aufweisen. Dieser Wert erscheint in der Basistabelle in mehreren Zeilen, in der gruppierten Ergebnistabelle nur noch einmal. In der SELECT-Klausel darf projeziert werden auf Attribute, auf die gruppiert wird Gruppenfunktionen, angewendet auf andere Attribute der Basistabelle Konstante Beispiel: SELECT gelesenVon, SUM( SWS ) FROM Vorlesungen GROUP BY gelesenVon;

18 HAVING-Klausel Ähnlich der WHERE-Klausel können an die mit GROUP BY gebildeten Gruppen zusätzliche Bedingungen gestellt werden Beipiele: SELECT gelesenVon, SUM( SWS) FROM Vorlesungen GROUP BY gelesenVon HAVING AVG( SWS ) > 3; SELECT Name, SUM( SWS) FROM Vorlesungen, Professoren WHERE gelesenVon = PersNr GROUP BY Name HAVING AVG( SWS ) > 3;

19 Geschachtelte Abfragen (subqueries)
Bisher: Festlegung der WHERE-Klausel mit einer (Menge von) Konstanten „Zu welchen Flugcoupons gibt es keine Flugtickets?“ SELECT AusstGes, AusstNr FROM FlCoupon; SELECT AusstGes, AusstNr FROM FlTicket WHERE AusstGes <> ... AND AusstNr <> ... ; Jetzt: Definition einer kompletten SQL-Anfrage mit Rückgabe der Ergebnismenge als Vergleichswerte an die äußere WHERE-Klausel

20 Geschachtelte Abfragen (Forts.)
Beispiele: SELECT AusstGes, AusstNr FROM FlTicket WHERE (AusstGes, AusstNr) NOT IN (SELECT AusstGes, AusstNr FROM FlCoupon ); SELECT Name FROM Professoren WHERE PersNr NOT IN (SELECT gelesenVon FROM Vorlesungen);

21 Der Existenzquantor EXISTS
Liefert TRUE, wenn eine Unterabfrage keine leere Ergebnismenge zurückgibt, sonst FALSE Beispiel: „Professoren, die keine Vorlesungen halten“ SELECT Name FROM Professoren WHERE NOT EXISTS (SELECT * FROM Vorlesungen WHERE gelesenVon = PersNr );

22 Mengen-Operationen Verknüpfung der Ergebnisse von SELECT-Anfragen
Operationen: INTERSECT, UNION, MINUS Beispiel: „Flugplätze, auf denen Flüge starten und landen“ SELECT AbFlPlatz FROM FlStrecke WHERE AbFlPlatz IS NOT NULL INTERSECT SELECT AnFlPlatz WHERE AnFlPlatz IS NOT NULL;

23 Verbindung mehrerer Tabellen (JOIN)
Grundlage: Primär-Fremdschlüssel-Beziehungen CROSS, NATURAL, INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, UNION-JOIN Beispiele: SELECT G.FlugGes ‘Kürzel‘, Name ‘Gesellschaft‘, AbFlPlatz ‘Start‘, AnFlPlatz ‘Ziel‘ FROM FlGes G INNER JOIN FlStrecke S ON G.FlugGes = S. FlugGes; SELECT P.PersNr, P.Name, V.Titel FROM Professoren P LEFT OUTER JOIN Vorlesung V ON P.PersNr = V.gelesenVon;

24 Rechte Regeln den Zugang (Authentifizierung) und den Zugriff auf die Objekte in der Datenbank (Autorisierung) Beispiele: GRANT CONNECT, RESOURCE TO Emil IDENTIFIED BY lime; GRANT SELECT ON FlCoupon, FlGast TO Max, Moritz: REVOKE UPDATE( Preis ) ON FlTicket TO Max;

25 JavaDataBaseConnectivity (JDBC)
Allgemeine Datenbank-Zugriffsschnittstelle für SQL (aktuelle Version 2.1) Übertragung der JAVA-Portabilität auf Datenbanken Teil von Java 2 (JDK1.2, Package java.sql) Basiert auf X/Open SQL CLI (und damit ODBC) Übersichtlicher und einfacher benutzbar als ODBC Unterstützt ANSI SQL92-Basisfunktionalität Erlaubt dynamische SQL-Anweisungen JDBC wurde für Java als eine Schnittstelle zu relationalen Datenbanken entworfen.

26 Beziehungen zwischen den Interfaces
executeQuery DriverManager Statement ResultSet DriverManager Statement getMoreResults ResultSet createStatement getConnection execute executeQuery prepareStatement Connection PreparedStatement getXXX Connection PreparedStatement setXXX prepareCall Datentypen: Date, Time, getXXX Datentypen: Date, Time, commit, rollback CallableStatement CallableStatement TimeStamp, Numeric, TimeStamp, Numeric, Java Datentypen, etc. Java Datentypen, etc. Funktionen Unterklasse weitere Methoden

27 Das JDBC API java.sql.DriverManager java.sql.Connection
java.sql.Statement java.sql.ResultSet java.sql.SQLException java.sql.Date, java.sql.Timestamp java.sql.DatabaseMetaData, java.sql.ResultSetMetaData Informationen von java.sql.DatabaseMetaData: - Name und Versionsnummer des benutzten Treibers - URL der Datenbank - Benutzername - unterstützte SQL-Datentypen - gespeicherte Stored Procedures - vorhandene Tabellen - Zugriffrechte - maximale Anzahl von Verbindungen, Spalten in Tabellen, Spalten in Indexen, ...

28 Abbildung SQL- auf Java-Datentypen

29 Java Database Connectivity (JDBC)
Java Applikation JDBC API JDBC Manager JDBC Treiber API JDBC Net Treiber für Treiber A Treiber B ... Treiber JDBC-ODBC Bridge Treiber für ODBC und DB JDBC Implementierungs- alternativen Bei der Datenbank-Anbindung mit Hilfe von JDBC werden in Abhängigkeit von ihrer Architektur vier verschiedene Treiber-Typen unterschieden. Für die Realisierung Web-basierter Anwendungen kommen jedoch nur die JDBC-Treiber vom Typ 3 oder 4 in Frage, da Treiber vom Typ 1 (über eine JDBC-ODBC-Bridge) respektive Typ 2 (Verwendung von Datenbank-Client-API) auf der Client-Seite auch Nicht-Java-Bibliotheken voraussetzen. Dies bedeutet, daß nicht die gesamte Applikation einzig mit einem Java-fähigen Browser auskommt, sondern daß noch zusätzliche Software-Installationen auf der Client-Seite notwendig sind. JDBC-Treiber vom Typ 3 öffnen keine direkte DB-Verbindung, sondern wickeln die gesamte DB-Kommunikation über einen Verbindungs-Server (JDBC-Server) ab. Dort erfolgt die Umsetzung der Anweisungen in ein dem DBS bekanntes Format, d.h. die Kommunikation über die Hersteller-API. Vorteile dieses Treiber-Typs sind die Flexibilität hinsichtlich der Kommunikation und zudem eine erhöhte Sicherheit, da der DB-Server über den Umweg Verbindungsserver auf einem beliebigen Rechner installiert sein kann. Der Verbindungs-Server kann zur Last-Balancierung eingesetzt werden. Bezüglich der Antwortzeiten besser sind JDBC-Treiber vom Typ 4, da sie direkten Kontakt zum DB-Server aufnehmen. Dazu ist eine Implementierung des Hersteller-spezifischen Kommunikationsprotokolls notwendig. Bedingt durch die auf den DB-Server im Internet zugreifenden Applets muß der Kommunikations-Port bekannt gemacht werden. Daher sind Treiber vom Typ 4 eher für Intranet-Anwendungen geeignet. Öffentliches Datenbankabhängige Zugriffsprotokolle Protokoll

30 JDBC-Treiber-Implementierung
JDBC-ODBC-Bridge (Typ 1) Nutzen vorhandener ODBC-Treiber Wegen Binärcode keine Eignung für Web-Anwendungen Native-API-Treiber (Typ 2) Basiert auf Bibliotheken des DBMS-Herstellers JDBC-Net-Treiber (Typ 3) Aufteilung Treiber in JDBC-Client und JDBC-Server JDBC-Client kann vollständig in Java realisiert werden Native-Protokoll-Treiber (Typ 4) Direkte Übersetzung der JDBC-Aufrufe in DBS-Aufrufe Client direkt mit Datenbankserver verbunden Nachteilig sind die i.A. proprietären DBS-Protokolle

31 Ablauf einer JDBC-Anwendung
Aufbau einer Verbindung zur Datenbank Explizites Laden eines Datenbanktreibers Automatisches Laden eines Datenbanktreibers (sql.drivers) Verbindungsaufbau mit UserID und Passwort Senden einer SQL-Anweisung Erzeugung einer SQL-Anweisung Verarbeiten der Anfrageergebnisse Über Resultset-Objekt nach dem Cursor-Prinzip

32 Aufbau einer Verbindung zur Datenbank
import java.net.URL; import java.sql.*; class JDBCExample { public static void main (String args[]) { try { // jdbc-odbc-bridge Treiber laden Class.forName (“sun.jdbc.odbc.JdbcOdbcDriver”); String url = Connection con = DriverManager.getConnection (url,‘userid‘, ‘password‘); } } Angefordert wird eine Verbindung durch Aufruf der Methode DriverManager.getConnection der Klasse java.sql.DriverManager. Im einfachsten Fall erwartet die Methode lediglich die Datenbankbezeichnung als Parameter. Erweiterte Formen gestatten die Angabe von Benutzernamen und Paßwort. Die zu übergebende Datenbankbezeichnung wird in einer speziellen Form, der JDBC-URL, angegeben. Die Struktur ist: jdbc:<subprotocol>:<subname> Das Feld subprotocol bezeichnet den Mechanismus für die Datenbankverbin-dung, beispielsweise ODBC. Das Feld subname kann nur im Zusammenhang mit dem Feld subprotocol ausgewertet werden. Die URL hat den Vorteil, daß die genauen Bezeichnungen für die Datenbank und den Ort nicht direkt angegeben werden müssen, sondern beispielsweise über einen Name Service weiter aufgelöst werden können: subprotocol enthält Name Service subname enthält aufzulösenden Datenbanknamen Weiterhin sind durch die URL alle Möglichkeiten offen, eine Datenbank zu adressieren: jdbc:<subprotocol>://<hostname>:<port>/<subname>

33 Senden einer SQL-Anweisung
// Suche eines Kunden String stmtSelect = “SELECT KundenNr FROM Kunden “+ “WHERE Nachname = ‘Gremminger’; “; // Anweisung erzeugen Statement stmt = con.createStatement( ); // Select -Anweisung ausführen resultSet rs = stmt.executeQuery( stmtSelect ); // SQL-Anweisungen ohne Resultset // Tabelle erzeugen stmt.executeUpdate( stmtcreate ); // Datensatz in Tabelle einfügen int rowcount = stmt.executeUpdate( stmtInsert)

34 Verarbeiten der Anfrageergebnisse
// Zeilenweiser Zugriff auf Ergebnismenge, Cursor zeigt vor 1. Zeile while (rs.next () ) { // Spaltenweiser Zugriff auf die aktuelle Zeile mittels // getXXX-Methoden und Index der Spalte oder Spaltennamen String s = rs.getString (1); double d = rs.getDouble (2); int i = rs.getInt (3); System.out.println (s + ‘ ‘ + d + ‘ ‘ + i); } // Freigabe der benutzten Ressourcen rs.close;

35 Fehlerbearbeitung try {
// Fehler werden als Ausnahmen (Exceptions) der Klasse SQLException // signalisiert try { // Aufruf von JDBC-Anweisungen, die Exception generieren } catch (SQLException exc) { System.out.println (‘SQLException: ‘ exc.getMessage () ); }

36 Verbindungen und Transaktionen
Es sind mehrere Verbindungen zu einer oder mehreren Datenbanken möglich (con1, con2, ... conn) Auswahl des Datenbankbereichs über Tripel Katalogname, Schemaname, Objektname (con.setCatalog( ... )) Transaktionssteuerung erfolgt auf aktiver Verbindung Commit/Rollback (con.rollback( )) AutoCommit (con.setAutoCommit( false ) Lesetransaktion (con.setReadOnly( true )) Isolationlevel (con.setTransactionIsolationlevel( Transaction_Serializable ))

37 Connection Pooling Reduktion der Zeiten für DB-Verbindungsaufbau/-abbau Ein Connection Pool ist ein Puffer von DB-Verbindungen Logische und physische DB-Verbindungen Instanzen von java.sql.Connection und java.sql.PooledConnection PooledConnection pcon = datastore.getPooledConnection (); Connection con = pcon.getConnection (); con.close; Vorteilhaft für mehrstufige Systemarchitekturen Web-Applikation mit Servlets und JDBC Applikationsserver für EJB

38 Gespeicherte Prozeduren
Ausführung von in der Datenbank gespeicherten Prozeduren Form: (call ProcedureName( Par1, Par2, ... ) Eingabeparameter müssen vor Ausführung der Anweisung initialisiert werden Ausgabeparameter müssen vor Ausführung der Anweisung registriert werden Rückgabe der Werte mit get-Operationen: getString, getDouble, getDate, getTimestamp, ... Gespeicherte Prozeduren (Stored Procedures) erlauben die Ausführung von Datenbankbefehlen auf dem (Datenbank-) Server. Dies führt i.a. zu einer Performance-Verbesserung, weil eine Vorverarbeitung unterstützt und die an den Client zu übertragende Datenmenge minimiert wird. Allerdings sind die Implementierungen dieser Technologie bisher zumeist proprietär (z.B. Oracle PL/SQL, etc.). Einen Ausweg scheinen hier die Java Stored Procedures zu zeigen, welche die Portabilität der Programmiersprache Java in den Datenbankbereich hinein bringen. An dieser Stelle sei auf eine weitere Tendenz hingewiesen. Der Zugriff auf Datenbanken aus Applets respektive JavaBeans heraus ist nicht ganz frei von Restriktionen (s.o.). Deshalb boten schon länger (insbesondere DBS-) Anbieter entsprechende proprietäre Server-Produkte mit Funktionalitäten zur Transaktionssteuerung, Benutzer- und Sitzungsverwaltung, aber auch für eine bessere Skalierbarkeit und sicherere Ausführungsumgebung an. Mittlerweile hat auch Java den Server mit den Servlets, Server Scripting und den Enterprise JavaBeans (EJB) entdeckt und ist auf dem besten Wege, diesen zu erobern. Erste Hersteller implementierten die Servlets (Apache) oder die EJB-Spezifikation bereits in ihren Produkten (Jaguar CTS). Ziel der EJB-Spezifikation ist es, einen Standard zur Entwicklung von wiederverwendbaren Komponenten zu schaffen und in einem EJB-Container zusammenzufassen. Zusammen mit CORBA eröffnen sich völlig neue Architekturaspekte für verteilte Informationssysteme im Internet/Intranet.

39 Programmierung Stored Procedures
// Anweisung zum Aufruf der Prozedur HoleKundenNr String stmtCall = “(call HoleKundenNr(?,?))”; // Call vorbereiten stmt = con.prepareCall( stmtCall ); // IN-Parameter setzen stmt.setString( 1, ‘Gremminger’ ); // Registrieren 2. Platzhalter als OUT-Parameter stmt.RegisterOutParameter( 2, java.sql.types.INTEGER ); // Anweisung ausführen stmt.executeQuery( ); int Kundennummer = stmt.getInt( 2 );

40 Dynamische SQL-Anweisungen
Ausführung von nicht vorübersetzten SQL-Anweisungen Die SQL-Anweisung enthält als Platzhalter das Zeichen “?” Platzhalter werden mittels set-Operationen und Bezug auf eine Position gesetzt: setString, setByte, setShort, setFloat, ...

41 Programmierung dynamischer SQL
PreparedStatement stmt = null; // Such-Anweisung String stmtSelect = “SELECT KundenNr, Nachname “+ “FROM Kunden “+ “WHERE Nachname = ?; “; // Select-Anweisung vorbereiten stmt = con.prepareStatement( stmtSelect ); // Gesuchten Nachnamen einsetzen stmt.setString( 1, “Gremminger” ); // Select-Anweisung ausführen ResultSet rset = stmt.executeQuery( );

42 Einbettung von SQL in Java (SQLJ)
Statische SQL-Anweisungen werden in den Java-Quelltext eingebettet SQL-Anweisungen werden zur Übersetzungszeit definiert Einzige Variabilität sind Parameter Übersetzung durch Präcompiler (Translator) in Aufrufe des SQLJ-Laufzeitsystems und SQLJ-Profile SQLJ-Laufzeitsystem (Package sqlj.runtime) benutzt i.d.R. JDBC-Aufrufe Translator führt syntaktische und semantische Überprüfungen durch

43 Java-Quelltext mit SQLJ
Programmierprinzip SQLJ Code Codierung Java-Quelltext mit SQLJ .sqlj Translator Java-Quelltext .java Java Code Java-Compiler SQLJ-Profil Bytecode .class Java Byte Code SQLJ- Laufzeitsystem Run Program JDBC

44 SQLJ-Konventionen SQLJ-Quelltexte besitzen die Endung “.sqlj“
Anweisungen beginnen mit “#sql“ und werden in geschweifte Klammern gesetzt #sql { INSERT INTO book VALUES (‘ ‘, ‘Oracle 8‘, 1, 3, 68.00); } Anweisungen werden mit “;“ abgeschlossen Verbindung zur Datenbank mittels JDBC-Mechanismen Es ist eine Default-Verbindung zu definieren

45 Host-Variablen In allen Embedded SQL-Lösungen Sind Variablen der Hostsprache Werden mit ":“ gekennzeichnet String findBook (String isbn) throws SQLException { String title; #sql { SELECT title INTO :title FROM book WHERE isbn = :isbn }; return title; } Dienen der Datenkommunikation zwischen SQL und der Host-Programmiersprache (IN, OUT, INOUT) Es sind Host-Ausdrücke erlaubt #sql price { VALUES (compute_price (:IN orderNo) ) };

46 Cursor-Konzept Zugriff auf Mengen von Ergebnistupeln
In SQLJ Iteratoren Vergleichbar Resultsets von JDBC Spaltentypen zur Über-setzungszeit festgelegt Arten benannter Iterator Positionsiterator Datenbank SQL Anwendungsprogramm Cursor Java

47 Namens-Iterator Spalten werden über Namen gebunden
#sql public iterator PersIter (string Name, int Jahr); PersIter iter; String Name = null; int Jahr = 0; #sql iter ={SELECT Name, Jahr FROM Personen} while (iter.next()) { Name = iter.name(); Jahr = iter.Jahr(); } iter.close(); Deklaration Iterator-Klasse Deklaration Iterator-Variable Instanziierung Iterator-Objekt Iterator-Methoden Freigeben Ressourcen

48 Positions-Iterator Spalten werden über Position gebunden
#sql public iterator PersIter (string, int); PersIter iter; String Name = null; int Jahr = 0; #sql iter ={SELECT Name, Jahr FROM Personen} while (true) { #sql {FETCH :iter INTO :Name, :Jahr}; if (iter.endFetch()) break; } iter.close(); Auslesen über Host-Variablen

49 Transaktionssteuerung
Basiert auf den JDBC-Mechanismen Manuelle Kontrolle #sql { COMMIT }; Festlegung des Zugriffsmodus #sql { SET TRANSACTION READ ONLY }; Festlegung des Isolationlevels #sql { SET TRANSACTION READ WRITE ISOLATIONLEVEL SERIALIZABLE };

50 Kontexte Verbindungskontext beschreibt Datenbankverbindung
Pro Verbindung ein Kontext-Objekt Connection con = DriverManager.getConnection (url, uid, pwd); DefaultContext ctx = new DefaultContext( con ); DefaultContext.setDefaultContext( ctx ); Umschaltung auf Kontext DefaultContext.setDefaultContext( ctx1 ); #sql { SQL-Operations }; alternativ: #sql [ctx1] { SQL-Operation }; #sql [ctx2] { SQL-Operation }; Ausführungskontext ctx.getExecutionContext().setQueryTimeout( 5 ); #sql [ctx] { SQL-Operation };

51 SQLJ-Translator Aufgaben
Syntaktische und semantische Überprüfungen Ersetzung SQLJ-Klauseln Code-Generierung für Iterator- , ...-Klassen Erzeugung von Profilen Profil enthält pro SQL-Anweisung Informationen über die SQL-Operationen, Typ und Übergaberichtung von Parametern und Ergebnisdaten Offline- vs. Online-Prüfung Implementierung als Kommandozeilenwerkzeug sqlj oder integriert in Java-Entwicklungsumgebung

52 Interoperabilität mit JDBC
Notwendig für Anwendungen, welche sowohl statisches als auch dynamisches SQL benötigen Interoperabilität betrifft Konvertierung Verbindungskontext/JDBC-Verbindung Konvertierung Iterator/ResultSet Beispiel: ResultSetIterator iter; #sql iter = { SQL-Operation }; ResultSet rs = iter.getResultSet ();

53 Java Stored Procedures
Entwicklungszyklus Implementierung als Java-Klassenmethoden (static) Installation als JAR-Datei auf DB-Server Registrierung im DB_Server (create proc ...) Aufruf (Call oder Values) Es sind keine GUI-Funktionen realisierbar Es existiert eine Default-DB-Verbindung Es ist kein Dateizugriff erlaubt Einsatz von JDBC oder SQLJ möglich

54 Implementierung Java Stored Procedures
public static double price {int orderno) throws SQLException { double res = 0.0; Connection con = DriverManager.getConnection (‘jdbc: ...); PreparedStatement stmt = con.prepareStatement (‘SELECT SUM( b.price * oi.num)‘ + ‘FROM book b, orderItem oi‘ + ‘WHERE oi.orderId = ? ‘ + ‘AND b.isbn = oi.isbn‘ ); stmt.setInt (1, orderno); ResultSet rs = stmt.executeQuery (); if (rs.next () ) res = rs.getDouble (1); stmt.close (); return res; }

55 Installation und Registrierung auf DB-Server
Übersetzung ggf. mit SQLJ-Translator > javac –d routines.java Erzeugung einer JAR-Datei > jar cf routines.jar routines.class Registrierung > CALL sqlj.install_jar (‘file:~/routines.jar‘, ‘routines_jar‘, deploy); Beispiel: CREATE FUNCTION price (orderNo INTEGER) RETURNS FLOAT MODIFIES SQL DATA EXTERNAL NAME ‘routines_jar:routines.price‘ LANGUAGE JAVA PARAMETER STYLE JAVA;

56 Beispiel aus Flugbuchungssystem (FBS)
Programmiersprache Java Hauptprogramm SQL-Schnittstelle Ergebnis Pre-Compiler

57 SQLJ vs. JDBC SQLJ JDBC knapp und bündig
bettet statisches SQL in Java ein #sql {INSERT INTO Angestellte VALUES(:n) }; JDBC flexibel performant bettet dynamisches SQL in Java ein Statement stmt = con.prepareStatement (“INSERT INTO Angestellte VALUES (?)“); stmt.setInt(1,n); stmt.execute;

58 Structured Query Language3 (SQL99)
Funktionale Erweiterungen des relationalen Datenmodells Integration von objektorientierten Konzepten zur Datenmodellierung in das relationale Datenmodell Große Objekte (Large Object, LOB): Größe bis einige GBs Geschachtelte Relationen: direkte Aufnahme von Wiederholungsgruppen Typdeklarationen (User Defined Types, UDT): anwendungsspez. Typen Referenzen: Erweiterung des Fremdschlüssel-Konzeptes Pfadausdrücke: ergeben sich wegen Referenzattribute Objektidentität: i.Ggs. zu relationalen Primärschlüsseln Operationen: Realisierung direkt in SQL oder extern in einer prozeduralen Programmiersprache Vererbung: realisiert Generalisierung und Spezialisierung Die SQL99-Standardisierung definiert ein standardisiertes objekt-relationales Datenmodell Achtung: heutige relationale DBS benutzen oft uneinheitliche Syntax

59 LOBs RDBMS speichern mittlerweile auch „frühere Dateien“ wie Fotografien, Audiodaten, Videosequenzen, Textdokumente etc. Für die Speicherung solcher Daten werden Large Objects (LOBs) standardisiert CLOB Character Large Object zur Speicherung langer Texte (z.B. Lebenslauf) Spezielle Zugriffsunterstützung BLOB Binary Large Objects zur Speicherung/Archivierung nicht zu interpretierender Daten (z.B. Passfoto (2MB)) NCLOB National Clob (deshalb wie Clobs) allerdings zur Speicherung von Texten mit Sonderzeichen (z.B. Unicode)

60 Einfache Benutzer-definierte Datentypen
Mit vordefinierten Datentypen lassen sich i.d.R. nicht alle anwendungsspezifischen Anforderungen abdecken Distinct Types basieren auf einem im Datenmodell eingebauten Typ Verhindern, dass Attributwerte semantisch falsch verwendet werden create final type NotenTyp as decimal(3,2) with comparisons; create table prüfen( MatrNr int, VorlNr int, PersNr int, Note NotenTyp); insert into prüfen values( 4711, 2, 12345, NotenTyp( 1.00 ) ); create function NotenDurchschnitt( NotenTyp ) returns NotenTyp source avg( decimal() );

61 Benutzerdefinierte strukturierte Objekttypen
VorlNr Titel SWS gelesenVon Voraussetzungen Vorlesungen 0815 DBS 4 4711 VIS 2 create or replace type VorlesungenTyp; create or replace type VorlRefListenTyp as table of ref VorlesungenTyp; create or replace type VorlesungenTyp as object( VorlNr number, Titel varchar(20), SWS number, gelesenVon ref ProfessorenTyp, Voraussetzungen VorlRefListenTyp, member function DurchfallQuote return number, member function AnzHörer return int );

62 Benutzerdefinierte strukturierte Objekttypen (Forts.)
create table Vorlesungen of VorlesungenTyp nested table Voraussetzungen store as Vorgaenger; insert into Vorlesungen select 0815, ‘DBS‘, 4, ref(p), VorlRefListenTyp() from Professoren p where name = ‘Gremminger‘; select 4711, ‘VIS‘, 2, ref(p), VorlRefListenTyp() /* Die Vorlesung VIS baut auf DBS auf */ insert into table (select nachf.Voraussetzungen from Vorlesungen nachf where nachf.titel = ‘VIS‘) select ref(vorg) from Vorlesungen vorg where vorg.titel = ‘DBS‘

63 Geschachtelte Objekt-Relationen
Schachtelung von Objekten (nicht nur Referenzen) in einem Objekt Bietet sich bei schwachen Entitätstypen/Kompositionen an MatrNr Name Semester hört absolviertePrüfungen Studenten Inhalt Prüfer Note Datum 12345 Max 4 ... 1.3 B 3.3 23456 Moritz 3 ... 1.0 5.0

64 Geschachtelte Objekt-Relationen (Forts.)
create or replace type PrüfungenTyp as object ( Inhalt ref VorlesungenTyp, Prüfer ref ProfessorenTyp, Note NotenTyp, Datum date, member function verschieben(neuerTermin date) return date ); create or replace type PrüfungsListenTyp as table of PrüfungenTyp; create or replace type StudentenTyp as object( MatrNr number, Name varchar(20), Semester number, hört VorlRefListenTyp, absolviertePrüfungen PrüfungslistenTyp, member function Notenschnitt return number, member function SummeWochenstunden return number

65 Geschachtelte Objekt-Relationen (Forts.)
create table Studenten of StudentenTyp (MatrNr primary key) nested table hört store as Belegung, nested table absolviertePrüfungen store as Examen; insert into Studenten values (12345, ‘Max‘, 4, VorlRefListenTyp(), PrüpfungsListenTyp());) (23456, ‘Moritz‘, 3, insert into table (select s.absolviertePrüfungen from Studenten s where s.Name = ‘Moritz‘) values ((select ref(v)from Vorlesungen v where v.Titel = ‘DBS‘), (select ref(p)from Professoren p where p.Name = ‘Gremminger‘), 1.0, Sysdate);

66 Geschachtelte Objekt-Relationen (Forts.)
/* Implementierung von Member-Funktionen */ create or replace type body StudentenTyp as member function SummeWochenstunden return number is i integer; vorl VorlesungenTyp; total number := 0; begin for i in 1..self.hört.count loop UTL_REF.SELECT_OBJECT(hört(i),vorl); total := total+vorl.SWS; end loop; return total; end; ... /* Aufruf von Member-Funktionen */ select s.Name, s.SummeWochenstunden() from Studenten s; /* Ausgabe einer geschachtelten Relation */ select s.Name, p.Prüfer.Name, p.Inhalt.Titel, p.Note from Studenten s, table(s.absolviertePrüfungen) p;

67 (Einfache) Vererbung von SQL-Objekttypen
create type AngestelltenTyp as (PersNr int, Name varchar(20)) instantiable; create type ProfessorenTyp under AngestelltenTyp (Rang char(2), Raum int); alter type ProfessorenTyp add method anzMitarbeiter() returns int language SQL contains SQL reads SQL data; create table Angestellten of AngestelltenTyp; create table Professoren of ProfessorenTyp under Angestellten inherit select privileges;

68 (Einfache) Vererbung von SQL-Objekttypen (Forts.)
create method anzMitarbeiter() for ProfessorenTyp return (select count(*) from Assistenten where Boss->PersNr = self..PersNr); insert into Professoren values (4711, ‘Gremminger‘, ‘C3‘, 310); /* Ausgabe aller Professoren und Assistenten */ select a.Name, a.PersNr from Angestellten a; Select a.Name, a.Boss->Name as Chef, a.Boss->anzMitarbeiter as anzJünger From Assistenten a;

69 Komplexe Attributtypen
create type NotenTyp as (NumWert decimal(3,2), Land varchar(20), StringWert varchar(20)); create type US_NotenTyp under NotenTyp as (WithHonours char(1)); create table Leistungen ( Teilnehmer varchar(20), Lehrveranstaltung varchar(20), Note NotenTyp); insert into Leistungen values (‘Egon’, ‘Java’, US_NotenTyp() ..Land(‘USA’) ..NumWert(4.0) ..StringWert(‘excellent’) ..withHonours(‘y’)); select Teilnehmer, Lehrveranstaltung, Note..Land, Note..NumWert from Leistungen;


Herunterladen ppt "Sprachschnittstellen von Datenbanksystemen"

Ähnliche Präsentationen


Google-Anzeigen