コード:
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 型を使用した理由を理解する必要があります