aaa Einschub: Kopplung von Programmiersprachen mit Datenbanksprachen … als Ergänzung zu Kapitel 7 der Vorlesung IS-K2000 SQLJ-1 Kopplung von SQL mit Programmiersprachen Kopplungsvarianten zwischen Programmiersprachen und Datenbanksprachen: 3 unterschiedliche Vorgehensweisen: 1) Erweiterung der Programmiersprache um Datenbankkonstrukte: Persistente Programmiersprachen, Datenbankprogrammiersprachen (z.B. Pascal/R) 2) Erweiterung der Datenbanksprache um Programmierkonstrukte: "4th Generation Languages" (4GLs), z. B. PLSQL von Oracle ...beide Möglickeiten bedeuten. Homogene Umgebung durch Schaffung einer neuen Programmiersprache! IS-K2000 SQLJ-2 1 aaa Kopplung von SQL mit Programmiersprachen -2 3) Einbettung der Datenbanksprache in die Programmiersprache: "Embedded SQL" (ESQL) Kernproblem bei der SQL-Einbettung: Abbildung von Tupelmengen auf die Datentypen der Wirtsprogrammiersprache Realisierte Lösung: Abbildung der Attributwerte eines Tupels auf die Datentypen der Programmiersprache -> Wirtsprogrammvariable (engl.: Host Variables) + Iteratoren (Schleifen) zur Verarbeitung von Tupelmengen: -> Cursor-Konzept SQLJ-3 IS-K2000 Standardarchitektur E S Q L/xxx-Q u e llp ro g ra m m D BKa ta lo g ES Q L-P re c o m p ile r fü r S p ra c h e x x x xxx-Q u e llp ro g ra m m m it p ro p rie tä re r D B-S c h n itts te lle n -C a lls o d e r S ta n d a rd C a ll-Le ve l-In te rfa c e D BLib ra ry x x x -Co m p ile r / Lin k e r a u s fü h rb a re s P ro g ra m m IS-K2000 D BD aKa teta n bloagn k SQLJ-4 2 aaa Wirtsprogrammvariable (Host Variables) Die Attribute eines Resultattupels einer SQL-Anfrage werden an speziell markierte Variable des Wirtsprogramms zugewiesen (INTO-Klausel). Beispiel: EXEC SQL SELECT PNr, Menge, Status INTO :pnr, :menge, :status FROM Bestellungen WHERE BestNr = 555; Analog können SQL-Anweisungen mittels solcher Variable mit Eingabeparametern versorgt werden. Beispiel: EXEC SQL INSERT INTO Bestellungen (BestNr,Monat,Tag,KNr,PNr, Menge) VALUES (:bestnr, :monat, :tag, :knr, :pnr, :menge); Wirtsprogrammvariable dienen als "Übergabepuffer" zwischen DBS und Programm. Generell werden dabei die SQL-Datentypen auf die Datentypen der jeweiligen Wirtsprogrammiersprache abgebildet. IS-K2000 SQLJ-5 Dynamisches vs. statisches SQL • Dynamisches SQL: Zur Laufzeit werden SQL-Anweisungen in Form von Zeichenketten erzeugt und an DB-Server übermittelt. • Statisches SQL: Anweisungen sind bereits zur Übersetzungszeit (statisch) gegeben. Vorteil: weniger Fehleranfälligkeit, da fehlerhafte Anweisungen/Typkonflikte bereits hier geprüft werden können. IS-K2000 SQLJ-6 3 aaa Embedded SQL für Java (SQLJ)... • SQLJ ist entstanden auf Vorschlag von ORACLE, aber u.a. auch von IBM, Sybase, Informix unterstützt. • Der Precompiler von ESQL wird bei SQLJ üblicherweise “Translator” genannt. • SQLJ erzeugt JDBC, eine standardisierte Call-Schnittstelle • SQL-Anweisungen haben die allgemeine Form: #sqlj{ SQL-Anweisung }; SQLJ-7 IS-K2000 Embedded SQL für Java - statisch (vereinfacht) SQLJsource program (sqlj *.sqlj) SQLJtranslator (“precompiler”) Java-source program with SQL statements via JDBC calls (javac *.java) Java language compiler Java byte code (java *) DB … int accountid; … #sqlj{ UPDATE account SET balance=balance*1.1 WHERE account_number = :accountid }; … • Preprocessor prüft, ob die Relation account existiert und ob die Attribute account_number und balance vorhanden sind. IS-K2000 SQLJ-8 4 aaa Plattformunabhängigkeit... • JDBC (= dynamisch) ist Standard-”Call-Level-Interface” an DB in Java. • Dadurch zusätzlich zur Plattformunabhängigkeit von Java auch weitgehend unabhängig von eingesetzten DB-Produkt. • SQLJ ist vom Vorhandensein eines JDBC-Treibers für die entsprechende DB abhängig. • zusätzlich kann ein “Customizer” spezielle DB-spezifische Optimierungen vornehmen, z.B. für “Oracle”; auch könnte ein Translator statt JDBC eine proprietäre Call-Level-Schnittstelle verwenden. IS-K2000 SQLJ-9 Host-Variablen • Host-Variablen: Abbildung von Tupeln bzw. Attributen auf die Datentypen der Programmiersprache #sqlj { SELECT PNr, Menge, Status INTO :pnr, :menge, :status FROM Bestellungen WHERE BestNr = 555 }; • anders als bei ESQL/C keine spezielle “SQL-DECLARESECTION” nötig. Java-Variablendeklaration genügt. “SQLJ Part 2” spezifiziert zusätzlich, wie benutzerdefinierte JavaTypen auch direkt innerhalb der DB verwendet werden können. IS-K2000 SQLJ-10 5 aaa SQLJ ... • Der Translator kann folgende Überprüfungen durchführen: – Korrektheit des Syntax – Übereinstimmung der Anweisungen mit dem DB -Schema – Typkompatibilität der Host-Variablen zwischen SQL und Java • Laufzeit-Fehlerbehandlung (allgemein): wie in JDBC über Java-Klasse “SQLException” und mittels eines “try … catch”-Blockes im Code möglich. SQLJ-11 IS-K2000 Iteratoren in SQLJ • (Benannte) Iteratoren: Iteratoren (Schleifen) zur Verarbeitung von Tupelmengen (“Cursor-Konzept”): #sql iterator VorlesungsIter( String titel, int nummer ); #sql vorlesungsIter = { SELECT titel, nummer FROM Vorlesungen }; • Navigation über die Iteratorvariable mittels .next-Operation möglich (->siehe Beispielprogramm) • Zusätzlich gibt es in SQLJ “Positions-Iteratoren”, welche unabhängig vom Attributnamen/Bezeichnung in Abhängigkeit von Position in der SELECTClause die Zuordnung vornehmen. IS-K2000 SQLJ-12 6 aaa Tabellendefinitionen - Beispiel “Vorlesung” CREATE TABLE Professoren ( name VARCHAR(64) NOT NULL, AHVNr VARCHAR(15) NOT NULL, rang VARCHAR2(12) NULL, -- "Voll" oder "Assistent" gehalt INTEGER, PRIMARY KEY(AHVNr), UNIQUE(name) ); Dieses Beispiel wurde nun stark vereinfacht, damit die wesentlichen Aspekte sichtbar werden. Später werden wir im Rahmen von SQL-3 u.a. auch die Subtypenbildung behandeln. IS-K2000 SQLJ-13 Tabellendefinitionen - Beispiel “Vorlesung” (II) CREATE TABLE Vorlesungen ( titel VARCHAR2(64) NULL, nummer INTEGER NOT NULL, dozent VARCHAR(15) NOT NULL, PRIMARY KEY(nummer), FOREIGN KEY(dozent) REFERENCES Professoren ); IS-K2000 SQLJ-14 7 aaa Beispielprogramm mit SQLJ import java.sql.SQLException; import oracle.sqlj.runtime.Oracle; /* Iterator definieren ("named iterator" !) */ #sql iterator VorlesungsIter( String titel, int nummer ); class VorlesungBsp { public static void main( String args[] ) throws SQLException { try { /* File connect.properties enthaelt alle noetigen Parameter */ Oracle.connect(VorlesungBsp.class, "connect.properties"); /* Prof. Einstein hinzufuegen String newProf = "Einstein"; */ /* newProf ist ein Beispiel fuer eine Host-Variable... */ #sql { INSERT INTO Professoren VALUES ( :newProf ,'123','Assistent',10000) }; SQLJ-15 IS-K2000 Beispielprogramm mit SQLJ (II) /* nun das Gehalt erhoehen... */ #sql{ UPDATE Professoren SET rang = 'Voll', gehalt = gehalt + 10000 WHERE name=:newProf }; /* hier muss noch ein Commit hin !!! */ #sql { COMMIT }; /* Iterator-Instanz erzeugen */ VorlesungsIter vorlesungsIter; String dozent="Schek"; /* Ergebnis der Query wird dem Iterator zugewiesen */ #sql vorlesungsIter = { SELECT v.titel, v.nummer FROM Vorlesungen v, Professoren p WHERE v.dozent=p.AHVNr AND p.name=:dozent }; IS-K2000 SQLJ-16 8 aaa Beispielprogramm mit SQLJ (III) /* Ergebnismenge mit dem Iterator durchlaufen: */ while( vorlesungsIter.next() ) { System.out.println( "Titel: " + vorlesungsIter.titel() ); System.out.println( "Nummer: " + vorlesungsIter.nummer() ); System.out.println(); } /* ...und den Iterator schliessen. */ vorlesungsIter.close() ; } catch( SQLException exception ) { System.err.println( "Error running the example: " + exception ); } } } IS-K2000 SQLJ-17 Literatur zu SQLJ: Seite des SQLJ-Konsortiums: www.sqlj.org “SQLJ Online Manual Oracle Version 8”, (lokal auf http://www.dbs.ethz.ch/~oracle/) G. Saake, K.-U. Sattler: “Datenbanken & Java. JDBC, SQLJ und ODMG”, dpunkt.verlag, 2000, (ISBN 3-932588-54-1) Paper, u.a. : Andrew Eisenberg, Jim Melton: SQLJ Part 0, Now Known as SQL/OLB (Object-Language Bindings). SIGMOD Record 27(4): 94-100 (1998) Andrew Eisenberg, Jim Melton: SQLJ-Part 1: SQL Routines Using the Java Programming Language. SIGMOD Record 28(4): 58-63 (1999) IS-K2000 SQLJ-18 9