我试图找出为什么在我执行将Oracle 11g表中的结果返回到ResultSet中的SQL查询后,我正在编写的Java代码中,ResultSet.next()永远不会出现...似乎在java.sql.Connection中使用PreparedStatement时,代码不会正确获取返回的ResultSet的内容。任何帮助表示赞赏,详情如下:
表:
CREATE TABLE "SHANDB"."ABSCLOBS"
( "ID" NUMBER,
"XMLVAL" "XMLTYPE",
"IDSTRING" VARCHAR2(20 BYTE)
)
数据:
INSERT INTO absclobs VALUES ( 1,
xmltype('<?xml version="1.0"?>
<EMP>
<EMPNO>221</EMPNO>
<ENAME>John</ENAME>
</EMP>', '1'));
INSERT INTO absclobs VALUES (2,
xmltype('<?xml version="1.0"?>
<PO>
<PONO>331</PONO>
<PONAME>PO_1</PONAME>
</PO>', '2'));
Java代码我正在运行以从上面获取值以测试代码:
public static void main(String[] args) throws Exception {
try {
String url = "jdbc:oracle:thin:@//localhost:1521/xe";
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
String user = "shandb";
String password = "test";
Class.forName(driver);
connection = DriverManager.getConnection(url,user, password);
String selectID1 = "SELECT a.xmlval.getClobval() AS poXML FROM absclobs a where idstring=? and id=? ";
PreparedStatement preparedStatement = connection.prepareStatement(selectID1);
preparedStatement.setString(1, "1");
preparedStatement.setInt(2, 1);
rowsUpdated = preparedStatement.executeQuery();
while(rowsUpdated.next()){
String clobxml = rowsUpdated.getString(1);
System.out.println(clobxml);
}
} catch (ClassNotFoundException cnfe) {
System.err.println(cnfe);
} catch (SQLException sqle) {
System.err.println(sqle);
}
finally{
System.out.println("Rows affected: " + rowsUpdated);
connection.close();
}
}
以上代码的这一部分永远不会运行,我不明白:
while(rowsUpdated.next()){
String clobxml = rowsUpdated.getString(1);
System.out.println(clobxml);
}
...但最终的print语句显示ResultSet不为空:
Rows affected: oracle.jdbc.driver.OracleResultSetImpl@15f157b
有谁知道为什么我无法显示实际检索到的XML clob内容,和/或为什么上面的while块永远不会是真的?
谢谢:)
答案 0 :(得分:3)
您的诊断错误 - 请:
Rows affected: oracle.jdbc.driver.OracleResultSetImpl@15f157b
未显示结果集非空。它只是显示rowsUpdated
的值是对oracle.jdbc.driver.OracleResultSetImpl
实例的引用,它不会覆盖toString()
。这很容易就是空的。
我怀疑问题只是你的WHERE
子句与任何记录都不匹配。为了诊断,我建议您将其更改为:
String selectID1 = "SELECT a.xmlval.getClobval() AS poXML FROM absclobs a";
(当然,摆脱参数设置调用)。这样你就可以看到所有你的表的值。然后,您可以继续发现WHERE
子句未按预期工作的原因。
(顺便说一句,目前尚不清楚为什么你没有在问题的代码中声明connection
或rowsUpdated
。它们肯定应该是局部变量......)