ResultSet.getBlob () Исключение - PullRequest
2 голосов
/ 04 августа 2009

Код:

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 в моем пути к классам. Я гуглил и нашел по существу только один сайт по этой конкретной проблеме, и он был бесполезен в.

У кого-нибудь есть идеи по этому поводу?


Небольшой фон: Мы конвертировали одну из наших баз данных из MySQL в Oracle. В базе данных MySQL одно из полей представляет собой длинный текст, который в коде рассматривается как BLOB. Средство разработки SQL по умолчанию преобразует длинный текст в CLOB (имеет смысл для меня), но код ожидал Blob. Полагаю, ошибка не была такой уж приятной: oracle.jdbc.driver.T4CClobAccessor (хотя там упоминается Clob).

Когда я попробовал следующее:

rs = stmt.executeQuery();

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

он выдал неподдерживаемое исключение - все, что мне нужно было сделать в первую очередь, это сравнить типы во вновь созданной базе данных Oracle с тем, что ожидал код (к сожалению, я просто предполагал, что они будут совпадать).

Извините, ребята! Не то чтобы я много думал об этом, теперь я должен выяснить, почему первоначальные разработчики использовали типы BLOB для длинного текста

Ответы [ 5 ]

4 голосов
/ 04 августа 2009

Не уверен насчет работы объекта Blob - обычно я пропускаю шаг Blob:

rs = stmt.executeQuery();

while (rs.next()) {
   byte[] blobbytes = rs.getBytes("text");
   String text = new String(blobbytes);
}
2 голосов
/ 04 августа 2009

попробуйте использовать последнюю версию драйверов (10.2.0.4). Попробуйте также драйверы для JDK 1.4 / 1.5, так как classes12 предназначены для JDK 1.2 / 1.3.

1 голос
/ 04 августа 2009

У меня есть служебный метод в суперклассе 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», но в то время была какая-то проблема, которая сделала вышеописанное более надежным.

1 голос
/ 04 августа 2009

Try ...

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

... вместо

0 голосов
/ 04 апреля 2013

Когда JDBC возвращает ResultSet из базы данных Oracle, он всегда возвращает OracleResultSet. Если вы набираете его как ResultSet, java передает его в стандартный SQL ResultSet. OracleResultSet переопределяет большинство методов типов данных, потому что типы данных Oracle не являются стандартными типами SQL. Другими словами, это сработало, потому что вы привели rs как OracleResultSet и использовали его метод getBlob

...