SQLJ

SQLJ(えすきゅーえるじぇい)は、コンピュータJavaプログラムSQL文を埋め込む方法(埋め込みSQL)を定めたISO標準 (ISO/IEC 9075-10) である。

APIであるJDBCとは異なり、SQLJはプログラミング言語Javaを拡張したものである。そのため、SQLJプログラムを実行するためには、プログラムをコンパイルする前にプリプロセッサ(SQLJトランスレータ)で変換しなければならない。

SQLJがJDBCより優れている点は、次のとおりである。

  • SQLJプログラムは、JDBCを使ったJavaプログラムより短くなることが多い。
  • プリプロセス時にSQLの文法をチェックできる。

逆に劣っている点は、次のとおりである。

以下の例では、SQLJの文法とJDBCの用法を対比させる。

JDBCSQLJ
複数行のクエリ
 PreparedStatement statement = conn.prepareStatement(    "SELECT LASTNAME"  + " , FIRSTNME"  + " , SALARY"  + " FROM DSN8710.EMP"  + " WHERE SALARY BETWEEN ? AND ?"); statement.setBigDecimal(1, min); statement.setBigDecimal(2, max); ResultSet rs = statement.executeQuery(); while (rs.next()) {   lastname = rs.getString(1);   firstname = rs.getString(2);   salary = rs.getBigDecimal(3);   // 行を表示させる... } rs.close(); statement.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;   // 行を表示させる... } iter.close();
単一行のクエリ
 PreparedStatement statement = conn.prepareStatement(     "SELECT MAX(SALARY), AVG(SALARY)"   + " FROM DSN8710.EMP"); rs = statement.executeQuery(); if (!rs.next()) {   // エラー -- 該当行なし } maxSalary = rs.getBigDecimal(1); avgSalary = rs.getBigDecimal(2); if (rs.next()) {   // エラー -- 複数行が存在 } rs.close(); statement.close();
 #sql [ctx] {   SELECT MAX(SALARY), AVG(SALARY)     INTO :maxSalary, :avgSalary     FROM DSN8710.EMP };
挿入
 statement = conn.prepareStatement(    "INSERT INTO DSN8710.EMP " +    "(EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) "  + "VALUES (?, ?, ?, ?, CURRENT DATE, ?)"); statement.setString(1, empno); statement.setString(2, firstname); statement.setString(3, midinit); statement.setString(4, lastname); statement.setBigDecimal(5, salary); statement.executeUpdate(); statement.close();
 #sql [ctx] {   INSERT INTO DSN8710.EMP     (EMPNO,  FIRSTNME,   MIDINIT,  LASTNAME,  HIREDATE,     SALARY)   VALUES     (:empno, :firstname, :midinit, :lastname, CURRENT DATE, :salary) };

外部リンク