2

コード:

ResultSet rs = null;

try { 
    conn = getConnection();
    stmt = conn.prepareStatement(sql);
    rs = stmt.executeQuery();

    while (rs.next()) {
        Blob blob = rs.getBlob("text");
        byte[] blobbytes = blob.getBytes(1, (int) blob.length());
    String text = new String(blobbytes);

結果:

java.sql.SQLException: Invalid column type: getBLOB not implemented for class oracle.jdbc.driver.T4CClobAccessor
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.Accessor.unimpl(Accessor.java:357)
at oracle.jdbc.driver.Accessor.getBLOB(Accessor.java:1299)
at oracle.jdbc.driver.OracleResultSetImpl.getBLOB(OracleResultSetImpl.java:1280)
at oracle.jdbc.driver.OracleResultSetImpl.getBlob(OracleResultSetImpl.java:1466)
at oracle.jdbc.driver.OracleResultSet.getBlob(OracleResultSet.java:1978)

クラスパスに class12_10g.zip があります。私はグーグルで検索しましたが、この特定の問題に関するサイトは基本的に1つしか見つかりませんでしたが、役に立ちませんでした.

誰かがこれについて何か考えを持っていますか?


ちょっとした背景: データベースの 1 つを MySQL から Oracle に変換していました。MySQL DB 内では、フィールドの 1 つがロングテキストで、コード内で BLOB として扱われます。デフォルトでは、SQL 開発者ワークベンチは longtext を CLOB に変換しますが (私には意味があります)、コードは Blob を予期していました。エラーはそれほど良くなかったと思います:oracle.jdbc.driver.T4CClobAccessor(Clobについては言及していますが)。

私が次のことを試したとき:

rs = stmt.executeQuery();

while (rs.next()) {
   byte[] blobbytes = rs.getBytes("text");
   String text = new String(blobbytes);
}

サポートされていない例外がスローされました-最初にやらなければならなかったのは、新しく作成されたOracle DBの型をコードが期待していたものと比較することだけでした(残念ながら、それらが一致すると仮定しました)。

ごめんなさい!あまり考えたわけではありませんが、元の開発者が長いテキストに BLOB 型を使用した理由を理解する必要があります

4

5 に答える 5

4

Blob オブジェクトが機能するかどうかわからない -- 私は通常、Blob のステップを飛ばします:

rs = stmt.executeQuery();

while (rs.next()) {
   byte[] blobbytes = rs.getBytes("text");
   String text = new String(blobbytes);
}
于 2009-08-04T17:28:29.123 に答える
2

最新バージョンのドライバー (10.2.0.4) を使用してみてください。classes12 は JDK 1.2/1.3 用であるため、JDK 1.4/1.5 用のドライバーも試してください。

于 2009-08-04T17:32:49.223 に答える
1

試す...

  PreparedStatement stmt = connection.prepareStatement(query);
  ResultSet rs = stmt.executeQuery();
  rs.next();
  InputStream is = rs.getBlob(columnIndex).getBinaryStream();

...代わりは?

于 2009-08-04T17:29:12.023 に答える
1

すべての DAO の DAO スーパークラスにユーティリティ メソッドがあります。

protected byte[] readBlob(oracle.sql.BLOB blob) throws SQLException {

    if (blob != null) {
        byte[] buffer = new byte[(int) blob.length()];
        int bufsz = blob.getBufferSize();
        InputStream is = blob.getBinaryStream();
        int len = -1, off = 0;
        try {
            while ((len = is.read(buffer, off, bufsz)) != -1) {
                off += len;
            }
        } catch (IOException ioe) {
            logger.debug("IOException when reading blob", ioe);
        }
        return buffer;
    } else {
        return null;
    }
}

// to get the oracle BLOB object from the result set:
oracle.sql.BLOB blob= (oracle.sql.BLOB) ((OracleResultSet) rs).getBlob("blobd");

誰かが「なぜ XYZ をしなかったのか」と言うでしょうが、当時、上記をより信頼できるものにするいくつかの問題がありました。

于 2009-08-04T17:33:54.183 に答える