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。我用谷歌搜索,基本上只发现了一个关于这个特定问题的网站,而且没有帮助。

有人对此有任何想法吗?


一点背景知识:我们正在将我们的一个数据库从 MySQL 转换为 Oracle。在 MySQL 数据库中,其中一个字段是长文本,在代码中被视为 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 类型用于 longtext

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)。还可以尝试 JDK 1.4/1.5 的驱动程序,因为 classes12 用于 JDK 1.2/1.3。

于 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 回答
0

当 JDBC 从 Oracle 数据库返回一个 ResultSet 时,它总是返回一个 OracleResultSet。如果您将其键入为 ResultSet,java 会将其向上转换为标准 SQL ResultSet。OracleResultSet 覆盖了大多数数据类型方法,因为 Oracle 数据类型不是标准 SQL 类型。换句话说,这很有效,因为您将 rs 转换为 OracleResultSet,并使用了它的 getBlob 方法。

于 2013-04-04T19:44:24.677 回答