查询代码及查询方式:
ps = conn.prepareStatement("select instance_id, ? 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");
ps.setString(1,"SUBSTR(DSN,27,16)");
ps.setInt(2,defaultWasGroup);
ps.setString(3,"%Module=jvmRuntimeModule:freeMemory%");
rs = ps.executeQuery();
while (rs.next()) { bla blah blah blah ...
返回一个空的ResultSet
.
通过基本调试,我发现问题在于第三个绑定,即
DSN like '?'
我尝试过各种变体,其中最明智的似乎是使用:
DSN like concat('%',?,'%')
但这不起作用,因为我错过了'
在连接字符串的两侧,所以我尝试:
DSN like ' concat('%',Module=P_STAG_JDBC01:poolSize,'%') ' order by 2
但我似乎找不到一种方法让他们参与进来。
我缺少什么?
首先,PreparedStatement
占位符(那些?
事物)是为了列值仅限,不适用于表名、列名、SQL 函数/子句等。更好的利用String#format() http://java.sun.com/javase/6/docs/api/java/lang/String.html#format%28java.lang.String,%20java.lang.Object...%29反而。其次,你应该not引用占位符,例如'?'
,它只会导致最终查询出现错误。这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%");
See also:
- Sun JDBC 教程:使用准备好的语句 http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html
- 格式化字符串语法 http://java.sun.com/javase/6/docs/api/java/util/Formatter.html#syntax
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)