SELECTリストにバインド変数
こんなことができるのかとビックリした。想像力が足りないと反省。
しかも、それにある条件が加わると、Oracleのバグを呼び起こすらしい。
import java.sql.*; public class test { public static void main(String[] args) throws Exception { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; try { con = DriverManager.getConnection("jdbc:odbc:test"); stmt = con.prepareStatement("SELECT id, ? AS hoge FROM table1"); stmt.setString(1, "hoge"); rs = stmt.executeQuery(); while(rs.next()) { System.out.println(rs.getInt("id") + ", " + rs.getString("hoge")); } } finally { if(rs != null) { rs.close(); } if(stmt != null) { stmt.close(); } if(con != null) { con.close(); } } } }
結果はこう。(table1に1〜4の4件レコードが入っている場合)
1, hoge 2, hoge 3, hoge 4, hoge
ところで、JDBCの例外処理ってどう書くのが正しいのだろう。
上のサンプルコードだと、rs.close()で失敗したときに、
stmt.close()が走らないので、正しくないような気がします。
やっぱり、さらにtry〜catch〜finallyを書くしかないのだろうか。。
今までは、上のようなコードで許されてきたのだが、
プロセス終了と共にリソースが開放されるバッチはともかく、
Webシステムは厳密にはダメなような気がする。
JDKドキュメント付属のJDBCサンプルも、エラー処理は甘いですね。