SQLJ Datenbanken und Informationsysteme I Stefan Böttcher Sven Groppe Universität Paderborn SQLJ • SQLJ ist in 3 Teile gegliedert: Part 0: Embedded SQL für Java • ANSI-Standard • Baut auf die JDBC API auf Part 1: Java Stored Procedures • Unterstützung der DBMS, nicht 100% konform zur SQLJ-Spezifikation • Statische Java-Methoden als Stored Procedures Part 2: Java-Klassen für benutzerdefinierte SQL-Datentypen • Entwurfsstadium, Unterstützung der DBMS fraglich • Reine Java-Klassen als SQL-ADTs • Alternative zu SQL3 Abstract Data Types Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 2 / 24 Embedded SQL für Java • Part 0: Embedded SQL für Java ANSI-Standard X3.135 „Information technology – Database language – SQL – Part 10:SQL/OLB“ Implementierungen von • • • • Oracle IBM Informix ... Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 3 / 24 SQL-Klauseln • Einbettung von SQL-Klauseln #sql {SQL-Operation} in die Wirtssprache Java •SQL-Operation kann folgendes sein: SELECT DML-Operationen INSERT, UPDATE, DELETE ROLLBACK und COMMIT DDL-Operationen wie CREATE TABLE Aufruf von Stored Procedures Zuweisungen mit SET Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 4 / 24 Einbettungsprinzip • import java.sql.*; import sqlj.runtime.ref.DefaultContext; public class SQLJProgram { public static void main(String[] args) { try{ Class.forName(“oracle.jdbc.driver.OracleDriver“); } catch(ClassNotFoundException e) { System.out.println(e.getMessage()); System.exit(1); } try{ Connection con=DriverManager.getConnection (“jdbc:oracle:[email protected]:1521:oradb01“, “user“, “password“); DefaultContext ctx = new DefaultContext(con); DefaultContext.setDefaultContext(ctx); #sql {INSERT INTO book VALUES (‘3-12345-26-37‘,‘SQLJ Buch‘,1,2,30.00,3)}; } catch(SQLException e) { System.out.println(e.getMessage()); } } } Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 5 / 24 Host-Variablen • Datenaustausch zwischen Java und SQL int host_id=123; String host_title; #sql { SELECT title INTO :host_title FROM book WHERE id=:host_id; } Richtung der Datenübergabe durch :IN host_variable bzw. :OUT, :INOUT definierbar, falls die Richtung in der SQLJ-Klausel nicht eindeutig gegeben ist (z.B. bei Methodenaufrufen) Java-Ausdrücke anstatt Host-Variablen, z.B. • arithmetische Ausdrücke (2+4) • Methodenaufrufe Date.valueOf(“2002-12-11“) Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 6 / 24 Iteratoren • Verwendung bei mengenwertigen Ergebnissen • Zwei Arten von Iteratoren: Benannte Iteratoren • Zuordnung von Spalten über Namen • Auslesen der Ergebniswerte über eine nach dem Spaltennamen benannte Funktion Positionsiteratoren • Zuordnung von Spalten über Position • Auslesen der Ergebniswerte mittels expliziter FETCH-Operation • Ähnliche Syntax zu Iteratoren in Embedded SQL für C Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 7 / 24 Benannte Iteratoren • #sql iterator ByName(String isbn, String title); ByName iter; #sql iter = { SELECT isbn, title FROM book }; while(iter.next()) { System.out.println( „isbn:“ + iter.isbn() + „ title:“ + iter.title()); } iter.close(); Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 8 / 24 Positionsiteratoren • #sql iterator ByPos(String, float); ByPos iter; String title; float price; #sql iter = { SELECT title, price FROM book }; while(true) { #sql { FETCH :iter INTO :title,:price }; if(iter.endFetch()) break; System.out.println( “title:“ + title + “price“ + price ); } iter.close(); Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 9 / 24 Verbindungskontext • #sql {...} bezieht sich immer auf genau eine Datenbankverbindung, dem DefaultContext • Zwischen mehreren Datenbankverbindungen kann durch Kontexte hin- und hergeschaltet werden, in dem der DefaultContext verändert wird: • DefaultContext.setDefaultContext(DefaultContext ctx) die auszuführenden SQL-Klausel mit einem Verbindungskontext qualifiziert wird: • #sql [ctx] { SQL-Operation }; Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 10 / 24 Interoperabilität mit JDBC • Konvertierung von SQLJ zu JDBC: Anwendungsfall: Ausführung zur Laufzeit dynamisch generierter SQLAnweisungen Von Verbindungskontext zu JDBC-Verbindung: Connection con = DefaultContext.getDefaultContext().getConnection(); Von (Benannten oder Positions-) Iterator zu ResultSet: ResultSet rset=iter.getResultSet(); • Konvertierung von JDBC zu SQLJ: Von einer aktiven JDBC-Verbindung zu einem SQLJ-Kontext: #sql context MyContext; MyContext ctx = new MyContext(con); Von einem ResultSet zu (Benannten wie Positions-) Iteratoren: #sql public iterator ByName( String title, double price); ByName iter; #sql iter = { CAST :rset }; Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 11 / 24 Kompilierung 1/3 Java-Quelltext mit SQLJ SQLJ-Translator - Syntax-Check - Datenbankschema? - Typkompatibilität Java/SQL-Variablen Java- SQLJQuelltext Profil Java-Compiler Bytecode DB SQLJ-Laufzeitsystem JDBC Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 12 / 24 Kompilierung 2/3 • Syntaxprüfung Java-Quelltext Syntax der SQLJ-Klauseln Nicht die eingebetteten SQL-Anweisungen • Semantikprüfung Offline-Prüfung der Host-Ausdrücke (d.h. Java-Ausdrücke innerhalb von #sql {...}-Klauseln) Optionale Online-Prüfung • Analyse der eingebetteten SQL-Operationen durch Datenbankaufrufe (nicht für DDL-Operationen (z.B. Create)) • Kompatibilitätsprüfung der Java-Ausdrücke zu den Typen der Spalten der Datenbankobjekte Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 13 / 24 Kompilierung 3/3 • Aufruf SQLJ-Translators ohne Online-Prüfung: sqlj SQLJProgram.sqlj mit Online-Prüfung: sqlj –driver <driver> –url <url for database> -user <user>/<passwd> SQLJProgram.sqlj erzeugt: - SQLJ-Profil in Form eines serialisierten Java-Objektes (Datei mit Endung .ser) der Klasse sqlj.runtime.profile.Profile. - übersetzte Java-Klasse (auch Java-Quelltext) mit Profilschlüsseln • Java-Programm ausführen mit java SQLJProgram Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 14 / 24 Profildatei 1/2 • Erzeugung einer Profildatei für jede #sql { ... } Anweisung • Zweck (innerhalb Referenzimplementierung): Anpassungen zur Nutzung herstellerspezifischer Features (Customization) => Gewährleistung der Portabilität auf Binärcode-Ebene • Aus #sql { UPDATE book SET stock = :stock WHERE isbn = :isbn }; wird ... Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 15 / 24 Profildatei 2/2 profile SQLJDemo_SJProfile0 entry 0 #sql { UPDATE book SET stock = :stock where isbn = :isbn } line number: 27 PREPARED_STATEMENT executed via EXECUTIVE_UPDATE ... contains 2 parameters 1. mode: IN, java type: int (int), sql type: INTEGER, name: stock, marker index: 25 2. mode: IN, java type: java.lang.String (java lang.String), sql type: VARCHAR, name: isbn, marker index: 50 result set type is NO_RESULT result set name is null contains no result columns Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 16 / 24 Stored Procedures • Part 1 der SQLJ-Spezifikation DBMS wie Oracle, DB2 nicht vollständig konform zur SQLJSpezifikation • In der Datenbank gespeichert und im Datenbankserver ausführbar Client Applikation ... Call p ... Datenbankserver Logik des Datenbankservers Java Prozedur p Java – Virtual Machine Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 17 / 24 Vorteile von Stored Procedures • Lokaler Zugriff und zentrale Verwaltung Reduzierung der Netzwerkbelastung (der Transfer von Zwischendaten entfällt) Anwendung von Datenbankdiensten wie Rechtevergabe und – auswertung, Backup, Recovery und Replikation. Softwareverteilungsmaßnahmen entfallen Stored Procedures unabhängig von der Client-Umgebung, nutzbar aus verschiedenen Implementierungssprachen => Wiederverwendbarkeit von Code Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 18 / 24 Entwicklung von Stored Procedures • Implementierung der Prozedur bzw. Funktion Statische Funktionen/Prozeduren (evtl. JDBC/SQLJ) public class Routines { public static double dm2euro(double val){ return val / 1.95583; } } • Installation im Server Übertragung des Codes zum Server Java: Jar-Archiv • Registrierung SQL-Operationen CREATE PROCEDURE ... bzw. CREATE FUNCTION ... Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 19 / 24 Aufruf von Stored Procedures • #sql { CALL proc(Parameterliste) } • Bei Funktionen mit Rückgabewert: #sql result = { VALUES (func(Parameterliste)) } z.B.: double euro; #sql euro = { VALUES (dm2euro(10)) } • In SQL-Anweisungen, z.B. SELECT title,dm2euro(price) AS euro_price FROM book; dm2euro darf im SELECT-Kontext keine Relation modifizieren weitere Regeln in anderen SQL-Kontexten sowie vom DBMS abhängig Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 20 / 24 Java-Klassen als SQL-Datentypen • Part 2: „SQL Types using the Java Programming Language“ • Keine Client-seitige Abbildung von SQL-Typen auf JavaKlassen, sondern • Installation im DB-Server und Nutzung als echte SQLDatentypen • Entwurfsstadium, Unterstützung von den DBMS-Herstellern fraglich Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 21 / 24 Java-Klasse als SQL-Datentyp public class Adress implements java.io.Serializable { public int zipcode=0; public String city=““; public String street=““; public Adress() {} public Adress(int zipcode, String city, String street) { this.zipcode=zipcode; this.city=city; this.street=street; } public String toString() { return zipcode+‘ ‘+city+‘,‘+street; } } Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 22 / 24 Anwendung der SQLJ-Datentypen • CREATE TABLE customer ( cust_id INTEGER, name VARCHAR(39), address Addr); • INSERT INTO customer VALUES(2,‘Otto‘ new Addr(‘33102‘,‘PB‘,‘Fü 11‘)); • SELECT address.zip, address.city FROM customer WHERE name=‘Otto‘; Variablen der Klasse address • SELECT name FROM customer WHERE address.to_String() like ‘33%‘; Methode der Klasse address Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 23 / 24 Literatur zu SQLJ • ANSI: Information technology -- Database languages -- SQL -- Part 10:SQL/OLB standard, ANSI X3.135, 1998. • ANSI: SQLJ-Part 1: SQL Routines. http://www.sqlj.org,1999. • ANSI: SQLJ-Part 2: SQL Types. http://www.sqlj.org. • G. Saake, K.-U. Sattler: Datenbanken & Java – JDBC, SQLJ und ODMG. dpunkt.verlag, 2000. Sven Groppe, Universität Paderborn Datenbanken und Informationssysteme I SQLJ 24 / 24