SQLJ z Standardisierte Java-DB-Schnittstelle z Spezifikationen – Part 0: Embedded SQL für Java (ANSI-Standard; Object Language Binding) Statische Einbettung von SQL-Anweisungen in Java-Quelltext – Part 1: Java Stored Procedures (ANSI-Standard; seit September 1999) Im DB-Server gespeicherte Java-Prozeduren & Java-Funktionen – Part 2: Java-Klassen für benutzerdefinierte SQL-Datentypen Verwendung von Java-Klassen als SQL-Datentypen z Oracle, IBM, Informix, Sybase, Tandem, Sun, Microsoft stehen dahinter z SQLJ ist vollständig in den SQL-Standard übernommen worden – – SQLJ Part 0 als SQL Part 10: Object Language Bindings (SQL/OLB) SQLJ Part 1 und 2 als SQL Part 13: SQL Routines and Types Using the Java Programming Language (SQL/JRT) ©Can Türker: SQL:1999 & SQL:2003 - Objektrelationale SQL, SQLJ & SQL/XML. dpunkt.verlag, 2003. ISBN: 3-89864-219-4. 206 Embedded SQL für Java- Überblick z z Vorübersetzung des um SQLAnweisungen erweiterten JavaQuelltextes in „echten“ Java-Code durch Translator sqlj Java-Quelltext mit eingebetteten SQL-Anweisungen SQLJ-Translator Überprüfung der SQLAnweisungen – – – SQLJProfil korrekte Syntax Übereinstimmung der Anweisungen mit DB-Schema Typkompatibilität der für den Datenaustausch genutzten Variablen z Customizing von Profilen z Nutzung von JDBC-Treibern Java-Quelltext mit JDBC-Aufrufen Customizer angepasstes Profil Syntax-Check DB Java-Compiler Java Byte-Code SQLJLaufzeitsystem JDBC ©Can Türker: SQL:1999 & SQL:2003 - Objektrelationale SQL, SQLJ & SQL/XML. dpunkt.verlag, 2003. ISBN: 3-89864-219-4. 207 Architektur von SQLJ Part 0 // Datei: Kunden.sqlj (Implementierung eines SQLJProgramms) Vorübersetzen des SQLJ-Programms > sqlj Routines.sqlj import java.sql.*; import sqlj.runtime.*; Kunden.java #sql iterator KundenIter(int KNr, String Name); public class Kunden { public static void main(String argv[]) { ... // lade passenden Treiber und stelle DB-Verbindung her Übersetzen des Java-Programms > javac Kunden.java Kunden.class KundenIter kunde; #sql kunde = { SELECT KNr, Name FROM Kunde }; Starten des Java-Programms > java Kunden while (kunde.next()) System.out.println(kunde.KNr() + ", " + kunde.Name()); kunde.close(); } Tabelle Kunde } ©Can Türker: SQL:1999 & SQL:2003 - Objektrelationale SQL, SQLJ & SQL/XML. dpunkt.verlag, 2003. ISBN: 3-89864-219-4. 208 SQLJ-Anweisungen z SQL-Anweisungen – – – – z QL-, DML- und DDL-Anweisungen Prozeduraufrufe Funktionsaufrufe Aufruf unbenannter SQL-Blöcke #sql { Anweisung }; #sql { CALL Prozedur(Param) }; #sql r = { VALUES(Funktion(Param)) }; #sql { BEGIN ... END }; Klassendefinitionen für – – Iteratoren Kontexte #sql iterator IteratorKlasse(Typdefinitionsliste); #sql context MyContext; ©Can Türker: SQL:1999 & SQL:2003 - Objektrelationale SQL, SQLJ & SQL/XML. dpunkt.verlag, 2003. ISBN: 3-89864-219-4. 209 Host-Variablen z Variablen einer Host-Sprache (hier Java), die in SQL-Anweisungen auftreten können z Verwendung: Austausch von Daten zwischen Host-Sprache und SQL z Zugriff auf Host-Variablen in SQLJ-Anweisungen mittels Doppelpunktnotation :variable z Beispiel: String kname; #sql { SELECT Name INTO :kname FROM Kunde WHERE KNr = 2322 }; ©Can Türker: SQL:1999 & SQL:2003 - Objektrelationale SQL, SQLJ & SQL/XML. dpunkt.verlag, 2003. ISBN: 3-89864-219-4. 210 Iteratoren z Java-Objekte, die das Cursor-Konzept implementieren z Formen: – Benannte Iteratoren #sql iterator KundeIter(int KNr, String Name); – Spaltenzugriff über Accessor-Methode mit dem Spaltennamen Iteration mittels Methode next() Positionsiteratoren #sql iterator KundePosIter(String); Spaltenzugriff über Position in der Anweisung Iteration mittels FETCH...INTO-Anweisung ©Can Türker: SQL:1999 & SQL:2003 - Objektrelationale SQL, SQLJ & SQL/XML. dpunkt.verlag, 2003. ISBN: 3-89864-219-4. 211 Benannte Iteratoren - Beispiel // Deklaration eines benannten Iterators #sql iterator KundeIter(int KNr, String Name); // Definition eines Iteratorobjekts KundeIter kunden; // Ausführung einer SQL-Anweisung; Population des Iterators #sql kunden = { SELECT KNr, Name FROM Kunde WHERE Name LIKE 'C%' }; // Iteration durch die Ergebnismenge; Spaltenzugriff mittels Accessor-Methoden while (kunden.next()) { System.out.println(kunden.KNr() + " " + kunden.Name(); } // Iterator schliessen kunden.close(); ©Can Türker: SQL:1999 & SQL:2003 - Objektrelationale SQL, SQLJ & SQL/XML. dpunkt.verlag, 2003. ISBN: 3-89864-219-4. 212 Positionsiteratoren - Beispiel // Deklaration eines Positionsiterators sowie einer Variablen #sql iterator KundePosIter(String); String kundenname; // Definition eines Iteratorobjekts KundePosIter kunden; // Ausführung einer SQL-Anweisung; Population des Iterators #sql kunden = { SELECT Name FROM Kunde WHERE Name LIKE 'C%' }; // Iteration durch die Ergebnismenge while (true) { #sql { FETCH :kunden INTO :kundenname }; if (kunden.endFetch()) break; System.out.println(kundenname); } // Hole nächsten Datensatz // Iterator am Ende? // Iterator schliessen kunden.close(); ©Can Türker: SQL:1999 & SQL:2003 - Objektrelationale SQL, SQLJ & SQL/XML. dpunkt.verlag, 2003. ISBN: 3-89864-219-4. 213 Verbindungskontext z Jede SQL-Anweisung wird mit einem Verbindungskontext assoziiert – Verbindung zur einer bestimmten DB mittels expliziten Verbindungskontext #sql context KundeKontext; String url = "jdbc:subprotocol:datasource"; String user = "scott"; String passwd = "tiger"; KundeKontext ctx = new KundeKontext(url, user, passwd, false) – Ausführung einer SQL-Anweisung in einem explizitem Verbindungskontext #sql [ctx] { SQL-Anweisung }; – Defaultkontext ConnectionContext.getDefaultContext() ©Can Türker: SQL:1999 & SQL:2003 - Objektrelationale SQL, SQLJ & SQL/XML. dpunkt.verlag, 2003. ISBN: 3-89864-219-4. 214 Ausführungskontext z Jede SQL-Anweisung wird in einem Ausführungskontext ausgeführt – Definition eines expliziten Ausfürhtungskontextes ExecutionContext execCtx = new ExecutionContext() – Ausführung einer SQL-Anweisung in einem explizitem Verbindungskontext #sql [execCtx] { SQL-Anweisung }; – Defaultkontext ConnectionContext.getExecutionContext() ©Can Türker: SQL:1999 & SQL:2003 - Objektrelationale SQL, SQLJ & SQL/XML. dpunkt.verlag, 2003. ISBN: 3-89864-219-4. 215 Verbindungsaufbau in Oracle z Oracle stellt Connect-Methode bereit, die eine DB-Verbindung und einen Default-Kontext aufbaut – Entspricht etwa Connection con = DriverManager.getConnection(url, user, passwd); DefaultContext ctx = new DefaultContext(con); DefaultContext.setDefaultContext(ctx); – Aufruf der Connect-Methode oracle.connect(url, user, passwd); – Alternativer Aufruf (Verbindungsparameter in connection.properties definiert) oracle.connect(JavaKlasse.class, "connection.properties"); ©Can Türker: SQL:1999 & SQL:2003 - Objektrelationale SQL, SQLJ & SQL/XML. dpunkt.verlag, 2003. ISBN: 3-89864-219-4. 216