java clob存储过程_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();  (每个项目获取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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值