SQLJ - SQLJ

SQLJ je zastaralý pracovní název pro snahy o kombinaci Java a SQL . Bylo to společné úsilí zahájené kolem roku 1997 inženýry z IBM , Oracle , Compaq , Informix , Sybase , Cloudscape a Sun Microsystems .

Skládá se ze tří částí: 0, 1 a 2. Část 0 popisuje vkládání příkazů SQL do programů Java. SQLJ část 0 je základem pro část 10 standardu SQL: 1999 , aka SQL Object Language Bindings (SQL / OLB). Část 1 a 2 SQLJ popisuje obrácenou možnost používat třídy Java (rutiny a typy) z příkazů SQL. Části 1 a 2 jsou základem pro část 13 standardu SQL, rutiny a typy SQL pomocí programovacího jazyka Java (SQL / JRT).

„SQLJ“ se běžně používá k označení právě SQLJ část 0, obvykle když je v kontrastu s jinými prostředky pro vkládání SQL do Javy, jako je JDBC .

Normy ANSI a ISO

  • SQLJ část 0: ANSI X3.135.10-1998, „Databázový jazyk SQL - Část 10: Vazby jazykového objektu (SQL / OLB)“
  • SQLJ část 1: ANSI NCITS 331.1-1999, „SQLJ - Část 1: Rutiny SQL pomocí programovacího jazyka Java“
  • SQLJ část 2: ANSI NCITS 331.2-2000, „SQLJ - část 2: Typy SQL používající programovací jazyk Java“

Část 0 byla aktualizována pro kompatibilitu s JDBC 2.0 a ratifikována ISO v roce 2000. Poslední dvě části byly při předání ISO kombinovány. Část 2 byla v zásadě přepsána pro podání ISO, protože verze ANSI nebyla pro specifikaci dostatečně formální, protože se blížila stylu uživatelské příručky . Kombinovaná verze byla ratifikována v roce 2002.

  • ISO / IEC 9075-10: 2000, Informační technologie - Databázové jazyky - SQL - Část 10: Vazby jazyků objektů (SQL / OLB)
  • ISO / IEC 9075-13: 2002, Informační technologie - Databázové jazyky - SQL - Část 13: Rutiny a typy SQL používající programovací jazyk Java (SQL / JRT) .

SQLJ část 0

Specifikace SQLJ část 0 do značné míry pochází od společnosti Oracle, která také poskytla první referenční implementaci.

V následujícím SQLJ je synonymum pro SQLJ část 0.

Zatímco JDBC poskytuje API , SQLJ se skládá z rozšíření jazyka . Programy obsahující SQLJ tedy musí být před kompilací spuštěny pomocí preprocesoru (překladače SQLJ).

Výhody

Mezi výhody SQLJ oproti JDBC patří:

  • Příkazy SQLJ bývají kratší než ekvivalentní programy JDBC.
  • Syntaxi SQL lze zkontrolovat v době kompilace. Výsledky vrácených dotazů lze také přísně zkontrolovat.
  • Preprocesor může generovat statický SQL, který funguje lépe než dynamický SQL, protože plán dotazů je vytvořen v době kompilace programu, uložen v databázi a znovu použit za běhu. Statický SQL může zaručit stabilitu přístupového plánu. IBM DB2 podporuje statické použití SQL v programech SQLJ.

Nevýhody

  • SQLJ vyžaduje krok předzpracování.
  • Mnoho IDE nemá podporu SQLJ.
  • SQLJ postrádá podporu pro většinu běžných persistence frameworků, jako je Hibernate .
  • Oracle 18c (12.2) zrušil podporu SQLJ v databázi.

Příklady

Následující příklady porovnávají syntaxi SQLJ s využitím JDBC.

Víceřádkový dotaz
JDBC SQLJ
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);
  // Print row...
}
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
};
do {
  #sql {
    FETCH :iter
     INTO :lastname, :firstname, :salary
  };
  // Print row...
} while (!iter.endFetch());
iter.close();
Jednořádkový dotaz
JDBC SQLJ
PreparedStatement stmt = conn.prepareStatement(
    "SELECT MAX(SALARY), AVG(SALARY)"
  + " FROM DSN8710.EMP");
rs = stmt.executeQuery();
if (!rs.next()) {
  // Error—no rows found
}
maxSalary = rs.getBigDecimal(1);
avgSalary = rs.getBigDecimal(2);
if (rs.next()) {
  // Error—more than one row found
}
rs.close();
stmt.close();
#sql [ctx] {
  SELECT MAX(SALARY), AVG(SALARY)
    INTO :maxSalary, :avgSalary
    FROM DSN8710.EMP
};
VLOŽIT
JDBC SQLJ
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)
};

Viz také

Reference

Další čtení

externí odkazy