【问题标题】:How to set a JDBC PreparedStatement parameter for an Oracle CHAR field?如何为 Oracle CHAR 字段设置 JDBC PreparedStatement 参数?
【发布时间】:2017-03-22 11:28:20
【问题描述】:

我认为我的 Oracle JDBC 准备语句遗漏了一些明显的东西。我正在尝试创建一个PreparedStatement,它从TABLE 中选择列A,其中B 是参数。例如,这也是我整理的测试代码:

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"));

现在这不起作用,我目前得到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"));

注意我是如何用字符串硬编码WHERE 语句的。

我遗漏了什么明显的东西?

我的maven依赖定义为:

<dependency>
  <groupId>com.oracle.jdbc</groupId>
  <artifactId>ojdbc7</artifactId>
  <version>12.1.0.2</version>
 </dependency>

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;

有输出

SQL_TEXT                             | Position                       | Value_String
SELECT A FROM TABLE WHERE B = :1     | 1                              | TEST
SELECT A FROM TABLE WHERE B = 'TEST' | <null>                         | <null>

【问题讨论】:

  • 可能是因为在第一个版本中您正在搜索TEXT,而在第二个版本中您正在搜索TEST
  • @Erik L,如果上述说法属实,那么这是一个大错误。为此 +1 给 kayaman。
  • 如果@Kayaman 说的是真的,这就是你通过“断开”工作几个小时来解决的问题哈哈哈
  • 对不起!这是我的示例中的一个错字,我已修复它。
  • 这可不好玩,你只是让问题变得更难了。但是,代码似乎是非常标准的 JDBC。我无法想象这是司机的错(将是一个非常大的错误)。

标签: java oracle jdbc


【解决方案1】:

除了@LppEdd 回答你也可以这样做来设置参数:

((OraclePreparedStatement)findStatement).setFixedCHAR(1, "TEST");

【讨论】:

    【解决方案2】:

    由于您的字段定义是CHAR(50),我认为您应该用空格填充您的String

    【讨论】:

    • 大火中的什么....行得通! findStatement.setString(1, String.format("%1$-50s", "TEST"));
    • 呃……这只是……太可怕了。远离CHAR 的另一个原因。
    猜你喜欢
    • 2019-11-14
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2016-05-23
    • 2011-02-20
    • 1970-01-01
    • 2012-09-26
    • 2012-04-07
    相关资源
    最近更新 更多