SQLJ

出典: フリー百科事典『ウィキペディア(Wikipedia)』

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)
 };

外部リンク[編集]