`

JAVA读取、写入、更新CLOB字段

阅读更多

        jdbc或PL/SQL中通过insert语句插入数据时,如果有CLOB字段,且插入的数据长度超过4000,且会报ORA-01704字符串文字太长的错。

一.java jdbc方式处理

        对于CLOB字段,其实就需要通过流的方式处理,如下是从网上搜集的一些处理方式。

1.CharacterStream方式

/*
--建表语句如下:
create table t_clob(
		id varchar2(32) primary key,
		clobfield CLOB
		);
 */

/**
 * 读取CLOB字段的代码示例
 */
public void readClob() {
	//自定义的数据库连接管理类 
	Connection conn = DbManager.getInstance().getConnection();
	try {
		PreparedStatement stat = conn
				.prepareStatement("select clobfield from t_clob where id='1'");
		ResultSet rs = stat.executeQuery();
		if (rs.next()) {
			oracle.sql.CLOB clob = (oracle.sql.CLOB) rs
					.getClob("clobfield");
			String value = clob.getSubString(1, (int) clob.length());
			System.out.println("CLOB字段的值:" + value);
		}
		conn.commit();
	} catch (SQLException e) {
		e.printStackTrace();
	}

	DbManager.getInstance().closeConnection(conn);
}

/**
 * 写入、更新CLOB字段的代码示例
 */
public void writeClob() {
	//自定义的数据库连接管理类 
	Connection conn = DbManager.getInstance().getConnection();
	try {
		conn.setAutoCommit(false);
		// 1.这种方法写入CLOB字段可以。
		PreparedStatement stat = conn
				.prepareStatement("insert into t_clob (id,clobfield) values(sys_guid(),?)");
		String clobContent = "This is a very very long string";
		StringReader reader = new StringReader(clobContent);
		stat.setCharacterStream(1, reader, clobContent.length());
		stat.executeUpdate();

		// 2.使用类似的方法进行更新CLOB字段,则不能成功 
		// stat.close();
		// stat =null;
		// stat =
		// conn.prepareStatement("update t_clob set clobfield=? where id=1");
		// stat.setCharacterStream(1, reader, clobContent.length());
		// stat.executeUpdate();

		// 3.需要使用for update方法来进行更新,
		// 但是,特别需要注意,如果原来CLOB字段有值,需要使用empty_clob()将其清空。
		// 如果原来是null,也不能更新,必须是empty_clob()返回的结果。
		stat = conn
				.prepareStatement("select clobfield from t_clob where id='1' for update");
		ResultSet rs = stat.executeQuery();
		if (rs.next()) {
			oracle.sql.CLOB clob = (oracle.sql.CLOB) rs
					.getClob("clobfield");
			Writer outStream = clob.getCharacterOutputStream();
			char[] c = clobContent.toCharArray();
			outStream.write(c, 0, c.length);
			outStream.flush();
			outStream.close();
		}
		conn.commit();
	} catch (SQLException | IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	DbManager.getInstance().closeConnection(conn);
}

2.BufferedReader方式

        CLOB用于存储大量的字符数据,读取CLOB的JDBC代码如下所示。

import java.sql.*;
import java.io.*;

public class ReadClob {
	public static void main(String[] args) {
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		BufferedReader reader = null;
		Connection conn = null;
		String driver = "oracle.jdbc.driver.OracleDriver";
		String strUrl = "jdbc:oracle:thin@127.0.0.1:1521:ORCL";
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(strUrl, "scott", "tiger");
			pstmt = conn
					.prepareStatement("select v_clob form ord where ORD_id =?");
			pstmt.setInt(1, 1);
			rset = pstmt.executeQuery();
			while (rset.next()) {
				Clob clob = rset.getClob(1);// java.sql.Clob类型
				reader = new BufferedReader(new InputStreamReader(clob
						.getAsciiStream()));
				String line = null;
				while ((line = reader.readLine()) != null) {
					System.out.println(line);
				}
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

        程序代码从结果集中获取CLOB字段,再将其转化为IO流进行读取。那么,JDBC将大量自读数据写入CLOB字段的操作需要首先用“for update”字句查找CLOB字段,然后从结果集中获取CLOB字段并转化为oracle.sql.CLOB类型进行写入操作。 

//写入操作
String stmtString = "select v_clob form ord  where ord_id =? for update";
pstmt = conn.prepareStatement(stmtString);
pstmt.setInt(1, 2);
rset = pstmt.executeQuery();
while(rset.next()){
	//造型为oracle.sql.CLOB
	CLOB clob = (CLOB)rset.getClob(1);
	String newClobDate = new String("NEW CLOOB DATE");
	Writer writer = clob.getCharacterOutputStream();
	//OutStream writer = clob.getAsciiOutputStream();
	writer.write(newClobDate);
}

3.生成一个clob对象,通过预处理的setClob达到插入更新的目的。

        方法一:

Connection con = dbl.loadConnection();
strSql = "insert into table1(id,a) values (1,EMPTY_CLOB())";
dbl.executeSql(strSql);
String str2 = "select a from table1 where id=1";

ResultSet rs = dbl.openResultSet(str2);
if(rs.next()){
    CLOB c = ((OracleResultSet)rs).getCLOB("a");
    c.putString(1, "长字符串");
    String sql = "update table1 set a=? where id=1";
    PreparedStatement pstmt = con.prepareStatement(sql);
    pstmt.setClob(1, c);
    pstmt.executeUpdate();
    pstmt.close();
}
con.commit();

        方法二:

Connection con = dbl.loadConnection();
CLOB clob   = oracle.sql.CLOB.createTemporary(con, false,oracle.sql.CLOB.DURATION_SESSION);
clob.putString(1,  "长字符串");
Sql1 = "update table1 set a=? where id=1";
PreparedStatement pst = con.prepareStatement(Sql1);
pst.setClob(1, clob);
pst.executeUpdate();
pst.close();
con.commit();

 

二.sql方式

        当通过insert语句直接插入大量字符串(主要是html的内容),超过4000字符时候,就会报:ORA-01489: 字符串连接的结果过长。

        虽然字段是clob,足以存储,但是通过这种直接插入的时候,因为没有强制指定带插入字符串为clob类型,oracle会把插入的字符串作为 “字符串类型”处理,由于oracle有最大字符串限制(不超过4000个字符),所以会报错。

        解决思路:指定待插入字符串类型为clob,可以使用过程或存储过程。

实例:

DECLARE
 REALLYBIGTEXTSTRING CLOB := '待插入的海量字符串';
BEGIN
   INSERT INTO test_table VALUES('test', REALLYBIGTEXTSTRING, '0');
end ;
/
commit;

补充:插入html内容,可能含有空格  ,字符&是oracle的关键字,因此插入之前要转义,如:'||chr(38)||'nbsp;

分享到:
评论

相关推荐

    java中操作oracle的CLOB字段精解

    Java 中操作 Oracle 的 CLOB 字段是一种常见的操作,在实际开发中,我们经常需要在 Oracle 数据库中存储和读取大型文本数据,这时就需要使用 CLOB(Character Large OBject)类型的字段来存储这些数据。下面我们将...

    jdbc 处理clob类型字段

    查询CLOB字段时,我们可以使用ResultSet的getClob方法获取Clob对象,然后通过getClob.length()或getSubString方法读取数据。例如: ```java String sql = "SELECT my_clob_column FROM my_table WHERE id = ?"; ...

    java读写oracle clob字段

    本教程将介绍如何使用Java来读取和写入Oracle数据库中的CLOB字段。 首先,我们需要引入相关的Java和Oracle JDBC驱动库。在上述代码中,我们看到`import oracle.jdbc.driver.OracleDriver;`,这表示我们将使用Oracle...

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

    本文将深入探讨这一主题,基于给定的代码示例,解析如何在Java环境中读取和写入Oracle数据库的CLOB字段。 ### Java存取Oracle CLOB类型字段 #### 1. 导入必要的包 在Java中处理Oracle的CLOB字段,首先需要导入相关...

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

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

    DELPHI的CLOB和BLOB存取处理.zip_DELPHI的CLOB和BLOB存取处理_hallzgz

    - CLOB字段可通过TField对象的AsWideString属性读取或设置,BLOB字段通过AsBlob属性。 - 读取大对象时,可以使用Stream对象,比如TMemoryStream,通过TField对象的LoadFromStream和SaveToStream方法实现数据的读写...

    jsp读取大对象CLOB并生成xml文件示例

    例如,我们有一个`documents`表,其中有一个名为`content`的CLOB字段,存储着XML格式的数据。 ```sql CREATE TABLE documents ( id INT PRIMARY KEY, title VARCHAR(255), content CLOB ); ``` 接下来,我们将...

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

    在JDBC中,CLOB对象被表示为`java.sql.Clob`接口的实例,提供了读取和修改CLOB字段的方法。 要读取CLOB字段并转换为String,你需要遵循以下步骤: 1. **建立连接**:使用`DriverManager.getConnection()`方法建立...

    oracle数据库中如何处理clob字段方法介绍

    - 示例代码展示了如何使用Java的反射机制调用`getCharacterOutputStream`方法写入CLOB字段。 6. **性能考虑**: - 大量操作CLOB字段可能导致性能下降,因此应尽量减少不必要的读写操作。 - 如果频繁操作,可以...

    JAVA对clob的操作

    CLOB操作与BLOB操作类似,但是在获取java.sql.Clob对象后需要强制转换为oracle.sql.CLOB对象,以便使用getCharacterOutputStream()方法将数据写入CLOB字段。 三、出库操作 出库操作可以使用ResultSet.getBlob()或...

    clob 的读存问题

    写入CLOB数据同样需要通过CLOB对象来实现。首先,需要创建一个新的CLOB对象,并将其关联到数据库表的CLOB字段上。然后,使用`setClob()`方法将CLOB对象设置到`PreparedStatement`对象的相应位置,最后执行更新或插入...

    clob增加、修改

    根据给定文件的信息,本文将深入探讨如何在Java中操作Oracle数据库中的CLOB字段,包括添加和修改等操作。CLOB(Character Large Object)是一种用于存储大量文本数据的数据类型,在处理如文章、评论等长文本时非常...

    java操作clob

    在 Java 中操作 Oracle 数据库中的 CLOB(Character Large Object)字段是一项常见的任务。CLOB 类型用于存储大量文本数据,如长篇文章或文档。本教程将详细介绍如何在 Java 中使用 JDBC 和 JNDI 连接访问 Oracle ...

    clob-blob.rar_blob and clob_clob_java CLOB_java oracle cl_oracle

    4. **写入CLOB**: - 创建一个`Clob`实例,可以使用`Connection.createClob()`方法。 - 将数据写入`Clob`,例如使用`setAsciiStream()`、`setCharacterStream()`或`setString()`方法。 - 在SQL插入或更新语句中...

    java将图片写入数据库,并读出来(blob clob)

    以上就是使用Java将图片写入数据库(使用Blob类型)并读出来的基本流程。在实际应用中,你可能需要处理异常、事务管理、性能优化等方面的问题。同时,为了提高效率,可以考虑将数据分块读写,特别是处理大文件时。...

    java中(注解符)处理Clob(blob)类型

    在 Java 中,处理 Clob 和 Blob 类型需要使用特殊的注解配置来确保正确地读取和写入数据。 一、Clob 类型的注解配置 在 Java 中,处理 Clob 类型需要使用 @Lob 注解来指定该字段为大规模字符数据类型。@Lob 注解...

    Oracle导出Clob,Blob工具版本2

    2. **错误修复**:解决了前一版本中的一个关键问题,即导出过程中的耗时问题,这可能与数据读取、序列化或写入过程有关。修复后,用户可以期待更稳定、更快的导出体验。 3. **依赖库**:压缩包中的文件如`Oracle....

Global site tag (gtag.js) - Google Analytics