SQL/J () - Universität Paderborn

Werbung
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
Herunterladen