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 ブロックが真にならない理由を知っている人はいますか?
ありがとう :)