Zum Inhalt springen

SQLJ

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 3. August 2006 um 19:54 Uhr durch YurikBot (Diskussion | Beiträge) (Bot: Ergänze: en:SQLJ). Sie kann sich erheblich von der aktuellen Version unterscheiden.

SQLJ (Embedded SQL) ist ein eingebettetes SQL für Java.

SQLJ ermöglicht eine direkte Einbettung von SQL-Anweisungen in Java-Code, wobei die statischen SQL-Anweisungen zur Übersetzungszeit syntaktisch und semantisch überprüft werden können.

SQLJ bietet mehrere Vorteile:

  • die Programmierung ist im Vergleich zu JDBC wesentlich einfacher, da SQLJ direkt auf Variablen des umgebenden Java Codes zugreifen kann.
  • SQLJ ist performanter als JDBC, da zur Compilierzeit Zugriffspfade ermittelt und in der Datenbank abgelegt werden können. Dadurch muss dies nicht zur Laufzeit durchgeführt werden.
  • im Falle von SQLJ für IBMs DB2 besteht eine bessere Authentifizierungskontrolle, da Benutzerrechte nicht auf Basis von Tabellen, sondern auf Basis von gebundenen SQLJ Profile (Packages) geprüft werden, damit ist eine programmorientierte Berechtigung möglich.

Nachteile sind

  • SQLJ-Programme müssen mittels eines Präprozessors in Java-Quelltext transformiert werden
  • die SQLJ Syntax wird von vielen Entwicklungsumgebungen nicht erkannt
  • SQLJ wird durch gängige Persistenz-Frameworks wie Hibernate nicht unterstützt
  • Der Präprozessor versteht, Stand Anfang 2006, noch keine Elemente der Java-Syntax, die mit den Versionen 1.4 (assert) und 5.0 (Generische Typen, Extended For Loop, u.a.) eingeführt wurden.
  • Der Präprozessor lädt unter Umständen Klassen, von denen die zu übersetzende Klasse abhängt. Dadurch werden ggf. Klasseninitialisierer ausgeführt, was u.U. Nebenwirkungen auslöst oder die Übersetzungszeit verlängert.

Eingebettete SQL-Anweisungen haben das folgende Format:

 #sql [[<context>]] { <SQL-Anweisung> }

Sie beginnen mit #sql und können mehrere Zeilen umfassen. Sie können Variablen der Programmiersprache (:x ) bzw. Ausdrücke :(y + z) enthalten.

Beispiele

Die folgenden Beispiele vergleichen SQLJ-Syntax mit JDBC-Aufrufen:

JDBC SQLJ
Abfrage
PreparedStatement stmt = conn.prepareStatement(
   "SELECT LASTNAME"
 + " , FIRSTNME"
 + " , SALARY"
 + " FROM DSN8710.EMP"
 + " WHERE SALARY BETWEEN ? AND ?");
stmt.setBigDecimal(1, min);
stmt.setBigDecimal(2, max);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
  lastname = rs.getString(1);
  firstname = rs.getString(2);
  salary = rs.getBigDecimal(3);
  // Zeile drucken...
}
rs.close();
stmt.close();
#sql private static iterator EmployeeIterator(String, String, BigDecimal);
...
EmployeeIterator iter;
#sql [ctx] iter = {
  SELECT LASTNAME
       , FIRSTNME
       , SALARY
    FROM DSN8710.EMP
   WHERE SALARY BETWEEN :min AND :max
};
while (true) {
  #sql {
    FETCH :iter
     INTO :lastname, :firstname, :salary
  };
  if (iter.endFetch()) break;
  // Zeile drucken...
}
iter.close();
Abfrage, die genau eine Zeile liefert
PreparedStatement stmt = conn.prepareStatement(
    "SELECT MAX(SALARY), AVG(SALARY)"
  + " FROM DSN8710.EMP");
rs = statement.executeQuery();
if (!rs.next()) {
  // Fehler -- nichts gefunden
}
maxSalary = rs.getBigDecimal(1);
avgSalary = rs.getBigDecimal(2);
if (rs.next()) {
  // Fehler -- mehr als ein Treffer
}
rs.close();
stmt.close();
#sql [ctx] {
  SELECT MAX(SALARY), AVG(SALARY)
    INTO :maxSalary, :avgSalary
    FROM DSN8710.EMP
};
INSERT
stmt = conn.prepareStatement(
   "INSERT INTO DSN8710.EMP " +
   "(EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) "
 + "VALUES (?, ?, ?, ?, CURRENT DATE, ?)");
stmt.setString(1, empno);
stmt.setString(2, firstname);
stmt.setString(3, midinit);
stmt.setString(4, lastname);
stmt.setBigDecimal(5, salary);
stmt.executeUpdate();
stmt.close();
#sql [ctx] {
  INSERT INTO DSN8710.EMP
    (EMPNO,  FIRSTNME,   MIDINIT,  LASTNAME,  HIREDATE,     SALARY)
  VALUES
    (:empno, :firstname, :midinit, :lastname, CURRENT DATE, :salary)
};