まず、PreparedStatement
プレースホルダー(?
もの)は列の値用です のみ、テーブル名、列名、SQL関数/句などには使用できません。 String#format()
を使用することをお勧めします 代わりは。第二に、あなたはすべきではありません '?'
のようなプレースホルダーを引用します 、それは最終的なクエリを奇形にするだけです。 PreparedStatement
セッターはすでにあなたのために引用(そしてエスケープ)の仕事をしています。
修正されたSQLは次のとおりです。
private static final String SQL = "select instance_id, %s from eam_measurement"
+ " where resource_id in (select RESOURCE_ID from eam_res_grp_res_map where"
+ " resource_group_id = ?) and DSN like ? order by 2");
使用方法は次のとおりです。
String sql = String.format(SQL, "SUBSTR(DSN,27,16)"); // This replaces the %s.
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, defaultWasGroup);
preparedStatement.setString(2, "%Module=jvmRuntimeModule:freeMemory%");
関連項目 :
- Sun JDBCチュートリアル:プリペアドステートメントの使用
- フォーマット文字列構文