コンテンツにスキップ

SQLJ

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

これはこのページの過去の版です。Semi-Brace (会話 | 投稿記録) による 2020年10月2日 (金) 15:34個人設定で未設定ならUTC)時点の版 (bulk replace (ns=0, <source> → <syntaxhighlight>) via script)であり、現在の版とは大きく異なる場合があります。

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
複数行のクエリ

<syntaxhighlight lang="java">

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

</source>

<syntaxhighlight lang="java">

#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();

</source>

単一行のクエリ

<syntaxhighlight lang="java">

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

</source>

<syntaxhighlight lang="java">

#sql [ctx] {
  SELECT MAX(SALARY), AVG(SALARY)
    INTO :maxSalary, :avgSalary
    FROM DSN8710.EMP
};

</source>

挿入

<syntaxhighlight lang="java">

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

</source>

<syntaxhighlight lang="sql">

#sql [ctx] {
  INSERT INTO DSN8710.EMP
    (EMPNO,  FIRSTNME,   MIDINIT,  LASTNAME,  HIREDATE,     SALARY)
  VALUES
    (:empno, :firstname, :midinit, :lastname, CURRENT DATE, :salary)
};

</source>

外部リンク