SQLJ ist ein mittlerweile veralteter Arbeitstitel für Bestrebungen, Java und SQL zusammenzuführen. SQLJ Teil 0 definiert die Möglichkeit, SQL Statements in Java-Programme einzubinden. Teil 0 wurde mittlerweile als Teil 10 Object Language Bindings (SQL/OLB) des Standards ISO/IEC 9075 der Datenbanksprache SQL übernommen. Die Teile 1 und 2 beschreiben den umgekehrten Weg, nämlich Java Klassen (Routines and Types) in SQL Statements anzusprechen. Teil 1 und 2 wurden als SQL Teil 13 SQL Routines and Types Using the Java Programming Language in SQL standardisiert.
Im Folgenden steht der Begriff SQLJ als Synonym für SQLJ Part 0.
Mit SQLJ ist Embedded SQL für Java definiert. Im Gegensatz dazu stellt JDBC eine API bereit.
Die eingebettete SQL-Anweisungen haben das folgende Format:
#sql [[<context>]] { <SQL-Anweisung> };
Sie beginnen mit der Zeichenfolge #sql, können mehrere Zeilen umfassen und enden mit einem Semikolon. Sie können Java-Variablen (:x) und Ausdrücke :(y + z) enthalten.
SQLJ bietet mehrere Vorteile:
Nachteile sind:
Die folgenden Beispiele vergleichen SQLJ-Syntax mit JDBC-Aufrufen:
JDBC | SQLJ |
---|---|
Abfrage | |
PreparedStatement stmt = conn.prepareStatement( "SELECT LASTNAME" + " , FIRSTNAME" + " , 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 | |
PreparedStatement 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) }; |