名前付きパラメーターを使用して SQL クエリを実行するために CallableStatement を使用していますが、パラメーターをバインドする順序によって異なる結果が得られます。これが私の完全なテストです:
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
変数がクエリに表示される順序で2 つの呼び出しを切り替えると、機能します。
私も試しました:
- setObject/getObject の代わりに setString/getString を使用する
- インデックスによる列の参照 (
resultSet.getObject(1)
col_a および2
col_b の場合) - 両方を組み合わせる:
resultSet.getString(resultSet.findColumn("col_a"))
私が間違っていること、またはこれを行うことができる他の方法について何か考えはありますか? ?
同じパラメーターを使用して異なるクエリを異なる順序で取得できるため、PreparedStatement の位置付けパラメーター (with ) を使用することはできません。
たとえば、次の 2 つのクエリを実行することができます。
select nvl(foo, :a), :b || something from my_table
select decode(:b, 'b', aaa, ccc), eee || :a from another_table
:a
これらのステートメントには、変数およびの存在以外に共通点はありません:b
。しかし、それらは同じ順序ではありません。つまり、最初のものでは機能しますが、2 番目のものでは機能しないため、それらを に置き換えて?
から、変数をバインドする PreparedStatement を使用することはできませんstmt.setObject(1, a); stmt.setObject(2, b);
。
参考までに、私は ojdbc6-11.2.0.2.0 を使用しており、データベースも 11.2.0.2.0 にあります。