SQLJ

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

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

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

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

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

[編集]

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

JDBC SQLJ
複数行のクエリ
 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)  }; 

外部リンク[編集]