【发布时间】: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。我无法想象这是司机的错(将是一个非常大的错误)。