CallableStatement,命名参数和绑定顺序

时间:2012-10-23 19:09:32

标签: java oracle jdbc callable-statement

我正在使用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以使变量出现在查询中的顺序,则可以正常工作。

我也试过了:

  • 使用setString / getString而不是setObject / getObject
  • 按索引引用列(col_a为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。

0 个答案:

没有答案