(SQLJ)

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