私は oracle 9i のプロジェクトに取り組んでいます。テーブルの特定の行をロードするトップリンク 10.1.3 に問題がありました。toplink が依存している jdbc ドライバーの動作が非常におかしいことがわかりました。ここにいる誰かが助けてくれるかもしれません...
次の名前のテーブルがあります:crazytable。「ver_num number(19) not null default 0」という列があります。この列は、数年前に元の挿入の一部として表に追加されました。crazytable から任意のレコード (jdbc 接続コードについては以下を参照) を選択し、rs.getLong(colIndex) を実行しようとすると、すべて正常に動作します。ただし、rs.getObject(colIndex) を実行すると、スタック トレースが取得されます。
java.lang.ArrayIndexOutOfBoundsException: 1
at oracle.sql.NUMBER.toBigDecimal(NUMBER.java:651)
at oracle.jdbc.dbaccess.DBConversion.NumberBytesToBigDecimal(DBConversion.java:2805)
at oracle.jdbc.driver.OracleStatement.getBigDecimalValue(OracleStatement.java:4539)
at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5666)
at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5622)
at oracle.jdbc.driver.OracleResultSetImpl.getObject(OracleResultSetImpl.java:739)
at oracle.jdbc.driver.OracleResultSet.getObject(OracleResultSet.java:1470)
stacktrace truncated to protect my poor code...
別のテーブルを取得して、sanetable と呼び、同じ名前の列に対して同じクエリを実行し、「ver_num number(19) not null default 0」と入力します。そして rs.getLong(colIndex) と rs.getObject(colIndex) は問題なく動作します。
どちらの列も、制約またはインデックスに関与していません。私はOracleドライバ9.2.0.8、9.2.0.5、9.2.0.1、さらには10.*を試しました(これは動作しません)。
私がここで何ができるか知っている人はいますか?
これは私の基本的な接続コードです。成功した呼び出しの唯一の違いは、問題の特定のテーブルです。
Class.forName(oracle.jdbc.OracleDriver.class.getName());
String url = "jdbc:oracle:thin:@IPADDRESS:PORT:INSTANCE";
Connection conn = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection(url, "user","pass");
PreparedStatement prepareStatement = conn.prepareStatement(
"select distinct ver_num " +
"FROM [crazytable|sanetable] "
);
rs = prepareStatement.executeQuery();
assertNotNull(rs);
while (rs.next()) {
ResultSetMetaData md = rs.getMetaData();
for (int i = 1; i <= md.getColumnCount(); i++) {
String key = md.getColumnLabel(i);
Object value = rs.getLong(key);
System.out.println(key+" : "+value
+" was null: "+rs.wasNull()
+" type: "+ rs.getType()
+" class: "+ md.getColumnClassName(i));
}
}
} finally {
if (rs != null) {
rs.close();
}
if (conn != null) {
conn.close();
}
}
編集: ドライバーは次のページにあります: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html