如何为 Oracle CHAR 字段设置 JDBCPreparedStatement 参数?

Eri*_*k L 2 java oracle jdbc

我认为我的 Oracle JDBC 准备语句遗漏了一些明显的内容。我正在尝试创建一个从参数所在位置PreparedStatement选择列的列。例如,这也是我总结的测试代码: ATABLEB

Class.forName("oracle.jdbc.driver.OracleDriver");
final Connection connection = DriverManager.getConnection(<Oralce JDBC connection stuff>);
final PreparedStatement findStatement = connection.prepareStatement("SELECT A FROM TABLE WHERE B = ?");

findStatement.setString(1, "TEST");

final ResultSet results = findStatement.executeQuery();
results.next();

System.out.println(results.getString("A"));
Run Code Online (Sandbox Code Playgroud)

现在这不起作用,我目前java.sql.SQLException: Result set after last row因为ResultSet空而得到。

然而,这有效:

Class.forName("oracle.jdbc.driver.OracleDriver");
final Connection connection = DriverManager.getConnection(<Oralce JDBC connection stuff>);
final PreparedStatement findStatement = connection.prepareStatement("SELECT A FROM TABLE WHERE B = 'TEST'");

final ResultSet results = findStatement.executeQuery();
results.next();

System.out.println(results.getString("A"));
Run Code Online (Sandbox Code Playgroud)

请注意我如何使用WHERE字符串对语句进行硬编码。

我缺少什么明显的东西吗?

我的 Maven 依赖定义为:

<dependency>
  <groupId>com.oracle.jdbc</groupId>
  <artifactId>ojdbc7</artifactId>
  <version>12.1.0.2</version>
 </dependency>
Run Code Online (Sandbox Code Playgroud)

B定义为CHAR(50)

这是来自Oracle的一些调试信息

select
  s.sql_text,
  bc.position,
  bc.value_string
from v$sql s
  left join v$sql_bind_capture bc
  on bc.sql_id = s.sql_id
  and bc.child_number = s.child_number
where
  s.sql_text like 'SELECT A%'
order by s.sql_id, bc.position;
Run Code Online (Sandbox Code Playgroud)

带输出

SQL_TEXT                             | Position                       | Value_String
SELECT A FROM TABLE WHERE B = :1     | 1                              | TEST
SELECT A FROM TABLE WHERE B = 'TEST' | <null>                         | <null>
Run Code Online (Sandbox Code Playgroud)

Eri*_*k L 5

除了 @LppEdd 答案之外,您还可以执行此操作来设置参数:

((OraclePreparedStatement)findStatement).setFixedCHAR(1, "TEST");
Run Code Online (Sandbox Code Playgroud)