0

我试图弄清楚为什么 ResultSet.next() 在我执行 SQL 查询后编写的 Java 代码中永远不会为真,该 SQL 查询将 Oracle 11g 表中的结果返回到该 ResultSet ......似乎代码没有在 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);
  }

...但是最后的打印语句显示 ResultSet 不为空:

Rows affected: oracle.jdbc.driver.OracleResultSetImpl@15f157b

有谁知道为什么我不能显示实际检索到的 XML clob 内容,和/或为什么上面的 while 块永远不会是真的?

谢谢 :)

4

1 回答 1

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条款没有按预期工作的原因。

(顺便说一句,不清楚为什么你没有声明connectionrowsUpdated在问题的代码中。它们绝对应该是局部变量......)

于 2013-01-02T20:29:53.523 回答