最近搞的Hibernate集成oracle817,读取Clob字段时一直报错:
io 异常: 类型长度大于最大值;
百度、google大家都说是驱动问题,换了N个驱动一样的错误,官网oracle817的驱动是.zip的,搞得不知怎么用,总是加载不到驱动,直接解压到classes文件中,报错:
java.lang.AbstractMethodError
最后看到oracle的jdbc目录下有demo,终于找到了正解:
// 读取CLOB字段 static String dumpClob(Connection conn, CLOB clob) throws Exception { String clobStr = ""; CallableStatement cstmt1 = (CallableStatement) conn .prepareCall("begin ? := dbms_lob.getLength (?); end;"); CallableStatement cstmt2 = (CallableStatement) conn .prepareCall("begin dbms_lob.read (?, ?, ?, ?); end;"); cstmt1.registerOutParameter(1, Types.NUMERIC); cstmt1.setClob(2, clob); cstmt1.execute(); long length = cstmt1.getLong(1); long i = 0; int chunk = 10; while (i < length) { cstmt2.setClob(1, clob); cstmt2.setLong(2, chunk); cstmt2.registerOutParameter(2, Types.NUMERIC); cstmt2.setLong(3, i + 1); cstmt2.registerOutParameter(4, Types.VARCHAR); cstmt2.execute(); long read_this_time = cstmt2.getLong(2); String string_this_time = cstmt2.getString(4); clobStr += string_this_time; // System.out.print("Read " + read_this_time + " chars: "); // System.out.println(string_this_time); i += read_this_time; } cstmt1.close(); cstmt2.close(); return clobStr; }
//读取BOLB static void fillBlob(Connection conn, BLOB blob, long length) throws Exception { CallableStatement cstmt1 = (CallableStatement) conn .prepareCall("begin dbms_lob.write (?, ?, ?, ?); end;"); long i = 0; long chunk = 10; byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; while (i < length) { cstmt1.setBlob(1, blob); cstmt1.setLong(2, chunk); cstmt1.setLong(3, i + 1); data[0] = (byte) i; cstmt1.setBytes(4, data); cstmt1.execute(); i += chunk; if (length - i < chunk) chunk = length - i; } cstmt1.close(); }
这种问题感觉应该比较常见,在网上竟没有解决方法,特此记录一下,供遇到同样问题的人员参考。
相关推荐
在处理Oracle数据库时,经常会遇到需要读取CLOB(Character Large Object)类型字段的情况。CLOB主要用于存储大量的文本数据,如文章、文档等内容。由于CLOB类型的数据量可能非常大,因此在读取时需要特别注意性能和...
本文将详细介绍如何在Oracle数据库中读取CLOB类型的字段,并提供一个示例代码片段来展示具体的实现过程。 #### CLOB的基本概念 CLOB是Oracle数据库提供的用于处理大量字符数据的一种特殊数据类型。它支持Unicode...
- **getCharacterStream()**:返回一个`java.io.Reader`对象,按照Unicode编码读取CLOB数据。 - **getAsciiStream()**:返回一个`java.io.InputStream`对象,按照ASCII编码读取CLOB数据。 当数据库中可能包含中文等...
- 当处理非常大的CLOB时,一次性读取整个CLOB可能导致内存不足或性能问题。 - 可以通过循环方式分段读取并拼接字符串。 2. **避免频繁转换**: - 如果CLOB数据会被频繁读取并转换为字符串,则应考虑优化读取逻辑...
### Oracle Blob转换Clob #### 知识点一:Oracle Blob与Clob的基本概念 - **Blob (Binary Large Object)**:在Oracle数据库中,Blob类型用于存储大量的二进制数据,如图像、视频或文档等非结构化数据。 - **Clob ...
为了解决 WebLogic 下 Oracle CLOB 类型转换的问题,可以通过反射机制来调用 `weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB` 类的 `getVendorObj()` 方法,该方法可以返回一个 `oracle.sql.CLOB` 类型的对象,从而...
ibatis 读取oracle clob类型
这里,`clob_data.read()`用于读取CLOB字段的内容。如果CLOB内容过大,你还可以设置`read`方法的参数来限制每次读取的字节数,以控制内存使用。 另外,有一种常见但可能导致错误的方法是使用`dbms_lob.substr`函数...
在描述中提到的“Oracle导出Clob,Blob等大字段工具”就是为了解决这个问题而设计的,它是一个自编写的实用程序,方便用户导出和管理Oracle数据库中的大对象数据。 Oracle数据库中的Clob类型用于存储大量的文本数据...
"Oracle导出Clob,Blob工具版本2" 是一个专为解决这个问题而设计的应用程序,它改进了对CLOB(Character Large Object)和BLOB(Binary Large Object)数据类型的导出效率,特别是修复了上一版本中导出时间过长的问题...
java读取oracle数据库中clob字段 把oracle数据库中字段类型为clob的字段值以字符串的形式读取出来
在Java应用程序中通过JDBC与Oracle交互时,正确地读取和写入CLOB类型的数据变得尤为重要。本文将详细介绍如何使用Java对Oracle中的CLOB类型字段进行操作。 #### CLOB简介 CLOB是Oracle数据库用于存储大型文本数据...
下面将详细介绍这两种数据类型以及如何在Oracle中使用它们存储和读取图片。 1. **CLOB数据类型**: `CLOB`数据类型用于存储大量的字符数据,最大可达到4GB。虽然主要用于存储文本,但在本例中,由于图片可以被转换...
在Oracle数据库环境中,数据类型BLOB(Binary Large Object)用于存储大量的二进制数据,如图像、音频或视频文件,而CLOB(Character Large Object)则用于存储大量文本数据。在某些情况下,可能需要将BLOB类型的...
我们使用了 Java 语言和 JDBC 驱动程序来实现数据的导出,并将 Image 类型数据写到文件中,然后将文件中的数据读取出来,并将其设置到 Oracle 的 CLOB 字段中。这种方法可以帮助我们实现不同数据库管理系统之间的...
### Hibernate 存取 Oracle 的 CLOB 在 Java 开发中,使用 Hibernate 框架进行数据库操作是非常常见的。其中,处理 Oracle 数据库中的 CLOB 类型数据是一项重要的技能。CLOB(Character Large Object)是一种用于...
在Oracle数据库中,CLOB(Character Large Object)是一种用于存储大量文本数据的数据类型,如XML文档、长篇文章或任何其他非二进制的大型数据。本文将深入探讨Oracle中的CLOB类型文字处理,以及如何在实际操作中...
查询CLOB字段时,我们可以使用ResultSet的getClob方法获取Clob对象,然后通过getClob.length()或getSubString方法读取数据。例如: ```java String sql = "SELECT my_clob_column FROM my_table WHERE id = ?"; ...