`
lihongyang66
  • 浏览: 75018 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

Oracle817读取CLOB问题解决

 
阅读更多

最近搞的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字段的值

    在处理Oracle数据库时,经常会遇到需要读取CLOB(Character Large Object)类型字段的情况。CLOB主要用于存储大量的文本数据,如文章、文档等内容。由于CLOB类型的数据量可能非常大,因此在读取时需要特别注意性能和...

    数据库读取clob字段

    本文将详细介绍如何在Oracle数据库中读取CLOB类型的字段,并提供一个示例代码片段来展示具体的实现过程。 #### CLOB的基本概念 CLOB是Oracle数据库提供的用于处理大量字符数据的一种特殊数据类型。它支持Unicode...

    java存储oracle中的clob类型

    - **getCharacterStream()**:返回一个`java.io.Reader`对象,按照Unicode编码读取CLOB数据。 - **getAsciiStream()**:返回一个`java.io.InputStream`对象,按照ASCII编码读取CLOB数据。 当数据库中可能包含中文等...

    ORACLE中CLOB字段转String类型

    - 当处理非常大的CLOB时,一次性读取整个CLOB可能导致内存不足或性能问题。 - 可以通过循环方式分段读取并拼接字符串。 2. **避免频繁转换**: - 如果CLOB数据会被频繁读取并转换为字符串,则应考虑优化读取逻辑...

    oracle Blob转换Clob

    ### Oracle Blob转换Clob #### 知识点一:Oracle Blob与Clob的基本概念 - **Blob (Binary Large Object)**:在Oracle数据库中,Blob类型用于存储大量的二进制数据,如图像、视频或文档等非结构化数据。 - **Clob ...

    weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB 类型转换解决办法

    为了解决 WebLogic 下 Oracle CLOB 类型转换的问题,可以通过反射机制来调用 `weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB` 类的 `getVendorObj()` 方法,该方法可以返回一个 `oracle.sql.CLOB` 类型的对象,从而...

    Python如何应用cx_Oracle获取oracle中的clob字段问题

    这里,`clob_data.read()`用于读取CLOB字段的内容。如果CLOB内容过大,你还可以设置`read`方法的参数来限制每次读取的字节数,以控制内存使用。 另外,有一种常见但可能导致错误的方法是使用`dbms_lob.substr`函数...

    ibatis 读取oracle clob类型

    ibatis 读取oracle clob类型

    Oracle导出Clob,Blob工具

    在描述中提到的“Oracle导出Clob,Blob等大字段工具”就是为了解决这个问题而设计的,它是一个自编写的实用程序,方便用户导出和管理Oracle数据库中的大对象数据。 Oracle数据库中的Clob类型用于存储大量的文本数据...

    Oracle导出Clob,Blob工具版本2

    "Oracle导出Clob,Blob工具版本2" 是一个专为解决这个问题而设计的应用程序,它改进了对CLOB(Character Large Object)和BLOB(Binary Large Object)数据类型的导出效率,特别是修复了上一版本中导出时间过长的问题...

    java读取oracle数据库中clob字段.txt

    java读取oracle数据库中clob字段 把oracle数据库中字段类型为clob的字段值以字符串的形式读取出来

    运用Java如何存取Oracle中的CLOB类型字段

    在Java应用程序中通过JDBC与Oracle交互时,正确地读取和写入CLOB类型的数据变得尤为重要。本文将详细介绍如何使用Java对Oracle中的CLOB类型字段进行操作。 #### CLOB简介 CLOB是Oracle数据库用于存储大型文本数据...

    图片存入Oracle中,用clob和blob两种方式

    下面将详细介绍这两种数据类型以及如何在Oracle中使用它们存储和读取图片。 1. **CLOB数据类型**: `CLOB`数据类型用于存储大量的字符数据,最大可达到4GB。虽然主要用于存储文本,但在本例中,由于图片可以被转换...

    oracle(blob转换为clob)

    在Oracle数据库环境中,数据类型BLOB(Binary Large Object)用于存储大量的二进制数据,如图像、音频或视频文件,而CLOB(Character Large Object)则用于存储大量文本数据。在某些情况下,可能需要将BLOB类型的...

    sql server中的image类型的数据导出到oracle的clob字段中

    我们使用了 Java 语言和 JDBC 驱动程序来实现数据的导出,并将 Image 类型数据写到文件中,然后将文件中的数据读取出来,并将其设置到 Oracle 的 CLOB 字段中。这种方法可以帮助我们实现不同数据库管理系统之间的...

    hibernate存取oracle的clob

    ### Hibernate 存取 Oracle 的 CLOB 在 Java 开发中,使用 Hibernate 框架进行数据库操作是非常常见的。其中,处理 Oracle 数据库中的 CLOB 类型数据是一项重要的技能。CLOB(Character Large Object)是一种用于...

    oracle数据库的clob大字段在jdbc中的处理方式

    5. **读取CLOB内容**:使用`Clob`接口提供的`getCharacterStream()`或`getAsciiStream()`方法获取CLOB的输入流。对于纯文本,通常使用`getCharacterStream()`。如果CLOB包含非ASCII字符,可能需要使用`...

    Oracle中CLOB类型文字处理代码

    在Oracle数据库中,CLOB(Character Large Object)是一种用于存储大量文本数据的数据类型,如XML文档、长篇文章或任何其他非二进制的大型数据。本文将深入探讨Oracle中的CLOB类型文字处理,以及如何在实际操作中...

Global site tag (gtag.js) - Google Analytics