0

Oracle 11g テーブルの結果をその ResultSet に返す SQL クエリを実行した後に、作成している Java コードで ResultSet.next() が決して true にならない理由を理解しようとしています...コードがそうではないようです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 ブロックが真にならない理由を知っている人はいますか?

ありがとう :)

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その後、句が期待どおりに機能しなかった理由を発見することができます。

(余談ですが、問題のコードでconnectionまたはrowsUpdatedを宣言していない理由は明らかではありません。それらは間違いなくローカル変数である必要があります...)

于 2013-01-02T20:29:53.523 に答える