プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやるITエンジニアがスキルアップの話を中心に日常を綴るブログです。

SELECTリストにバインド変数

こんなことができるのかとビックリした。想像力が足りないと反省。
しかも、それにある条件が加わると、Oracleのバグを呼び起こすらしい。


JDBC-ODBCブリッジで書いた例

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サンプルも、エラー処理は甘いですね。