SQLJ
表示
(ISO/IEC 9075-10から転送)
SQLJ(えすきゅーえるじぇい)は、コンピュータのJavaのプログラムにSQL文を埋め込む方法(埋め込みSQL)を定めたISO標準 (ISO/IEC 9075-10) である。
APIであるJDBCとは異なり、SQLJはプログラミング言語Javaを拡張したものである。そのため、SQLJプログラムを実行するためには、プログラムをコンパイルする前にプリプロセッサ(SQLJトランスレータ)で変換しなければならない。
SQLJがJDBCより優れている点は、次のとおりである。
- SQLJプログラムは、JDBCを使ったJavaプログラムより短くなることが多い。
- プリプロセス時にSQLの文法をチェックできる。
逆に劣っている点は、次のとおりである。
- プリプロセスが必要である。
- SQLJをサポートしている統合開発環境 (IDE) が少ない。
- Hibernateのような永続化フレームワーク (オブジェクトリレーショナルマッピング) でSQLJがサポートされていない。
例
[編集]以下の例では、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)
};
|