Java读取、写入、更新Clob字段

2019-07-31  本文已影响0人  ming_Liu

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();  (每个项目获取connection的方式不一样,依据自己项目情况而定。)

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); 

二.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;  

上一篇下一篇

猜你喜欢

热点阅读