我正在使用CallableStatement来执行带有命名参数的SQL查询,我会得到不同的结果,具体取决于我绑定参数的顺序。这是我的全部测试:
public void test() throws SQLException {
OracleDataSource ds = new OracleDataSource();
ds.setUser("abcd");
ds.setPassword("a");
ds.setURL("jdbc:oracle:thin:@efgh:1521:orcl");
Connection connection = ds.getConnection();
CallableStatement stmt = connection.prepareCall("select :a col_a, :b col_b from dual");
stmt.setObject(":b", "b");
stmt.setObject(":a", "a");
ResultSet resultSet = stmt.executeQuery();
resultSet.next();
Assert.assertEquals("a", resultSet.getObject("col_a"));
Assert.assertEquals("b", resultSet.getObject("col_b"));
}
失败是因为col_a包含“b”,而col_b包含“a”。如果我将两个调用切换到stmt.setObject
以使变量出现在查询中的顺序,则可以正常工作。
我也试过了:
resultSet.getObject(1)
,col_b为2
resultSet.getString(resultSet.findColumn("col_a"))
知道我做错了什么,或者其他任何方式我都可以做到这一点?
我不能在PreparedStatement中使用定位参数(使用?
),因为我可以使用不同顺序的相同参数获得不同的查询。
例如,我可以执行这两个查询:
select nvl(foo, :a), :b || something from my_table
select decode(:b, 'b', aaa, ccc), eee || :a from another_table
除了存在变量:a
和:b
之外,这些陈述没有任何共同之处。但它们的顺序不一样,这意味着我不能用?
替换它们,然后使用带有与stmt.setObject(1, a); stmt.setObject(2, b);
绑定的变量的PreparedStatement,因为它适用于第一个,但不适用于第二个
如果它有用,我使用ojdbc6-11.2.0.2.0,数据库也在11.2.0.2.0。