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