`

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

 
阅读更多
   jdbc或PL/SQL中通过insert语句插入数据时,如果有CLOB字段,且插入的数据长度超过4000,且会报ORA-01704字符串文字太长的错。
一.java jdbc方式处理
        对于CLOB字段,其实就需要通过流的方式处理,如下是从网上搜集的一些处理方式。
1.CharacterStream方式
Java代码  收藏代码
/* 
--建表语句如下: 
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代码如下所示。
Java代码  收藏代码
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类型进行写入操作。
Java代码  收藏代码
//写入操作  
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达到插入更新的目的。
        方法一:
Java代码  收藏代码
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();  

        方法二:
Java代码  收藏代码
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,可以使用过程或存储过程。
实例:
Sql代码  收藏代码
DECLARE  
 REALLYBIGTEXTSTRING CLOB := '待插入的海量字符串';  
BEGIN  
   INSERT INTO test_table VALUES('test', REALLYBIGTEXTSTRING, '0');  
end ;  
/  
commit; 

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

相关推荐

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

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

    以上就是通过JDBC读取Oracle数据库中CLOB字段并转换为String的基本过程。需要注意的是,由于CLOB可能包含大量数据,因此在读取时要考虑到性能和内存消耗。如果数据过大,可以考虑分块读取或使用流式处理,避免一次性...

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

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

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

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

    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字段,首先需要导入相关...

    clob增加、修改

    该类提供了一系列方法来读取和写入CLOB对象。 ### 二、Java操作CLOB字段的方法 #### 2.1 插入CLOB数据 插入CLOB数据通常涉及到以下步骤: 1. **创建空的CLOB对象**:使用`empty_clob()`函数创建一个空的CLOB对象。...

    Oracle clob和blob在jdbc的应用

    对于CLOB字段,我们通过`ResultSet.getClob()`方法获取`Clob`对象,然后可以获取它的ASCII流并进行处理。在示例中,使用`BufferedReader`读取并打印CLOB内容。对于BLOB字段,我们使用`ResultSet.getBlob()`方法获取`...

    利用spring的jdbcTemplate处理blob、clob

    spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。

    关于Oracle的 Clob数据类型在Hibernate中的应用小结

    在Hibernate中,如果Clob字段的值是字符串,可以通过将Clob字段映射为String类型,让Hibernate自动处理转换。这种方式简单易用,但可能不适合非常大的文本,因为可能会导致内存溢出。 3.3 直接使用Clob类型: 对于...

    JAVA对clob的操作

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

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

    - 创建一张名为`account_holder`的表,包含`id_no`字段作为主键,以及一个名为`xml_data`的CLOB字段用于存储XML数据。 3. **JSP页面准备**: - 创建一个新的JSP页面,命名为`generateXml.jsp`。 #### 三、核心...

    ibatis oracle clob

    在iBATIS中,我们需要特别关注如何正确地读取和写入CLOB字段。 首先,iBATIS(现在被称为MyBatis)是一个优秀的持久层框架,它允许开发者将SQL语句嵌入到Java代码中,以简化数据库操作。它通过XML或注解的方式配置...

    Oracle中CLOB类型文字处理代码

    可能包括了JSP、Servlet或Java后端代码,演示如何在Web应用中与Oracle数据库中的CLOB字段交互,如通过JDBC连接进行CRUD操作。 8. 注意事项: - 管理CLOB数据时要考虑性能,大量读写可能影响效率。 - 避免一次性...

    clob数据库表结构如下

    5. **读取和写入CLOB数据**:虽然代码中没有显示,但通常在处理CLOB数据时,需要调用`Clob`对象的`getCharacterStream()`方法来获取一个字符流,然后通过`BufferedReader`和`BufferedWriter`将数据读入内存并写入...

    clob-blob.rar_blob and clob_clob_java CLOB_java oracle cl_oracle

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

Global site tag (gtag.js) - Google Analytics