日期:2014-05-16 浏览次数:20578 次
? ? ? 搞了半天终于弄懂了oracle中NCLob的操作。其实它就是一个指针,我们插入修改事实上要改的是指针指向的地址数据。
也就是为什么,要先取出所指向的地址数据才能修改了。不过在操作Clob字段时,我的问题主要是String太长,传不到数据库。有人说换驱动包,但是我太固执没有换。后来试出来,可以分段传进存储过程就能搞定了。
?
首先content字段就是NCLOB类型的。存储过程如下:
--添加公告 procedure addNotice( m_title base_notice_data.title%type,--标题 m_docnum base_notice_data.docnum%type,-- m_author base_notice_data.author%type,--作者 m_content base_notice_data.content%type,--内容 m_id out base_notice_data.id%type--返回id )is begin insert into base_notice_data values( BASE_NOTICE_DATA_SEQ.nextval, m_title, m_docnum, m_author, 0, 0, m_content, sysdate, 0,1, BASE_NOTICE_DATA_SEQ.currval ); select BASE_NOTICE_DATA_SEQ.currval into m_id from dual; end addNotice;
-- 根据id查 只查content用于更新clob
procedure updateNoticeContent(
m_id base_notice_data.id%type,--更新的id
m_offset number,--指定开始操作的偏移量
m_content base_notice_data.content%type--更新的内容
) as
lobloc NCLOB;
begin
SELECT content INTO lobloc from base_notice_data where id =m_id FOR UPDATE;
dbms_lob.write(lobloc,length(m_content),m_offset,m_content);
end updateNoticeContent;
?java操作类中的添加公告方法:
public int addNotice(NoticeBean mb) throws Exception {
String sql = "{call PKG_Notice.addNotice(?,?,?,?,?)}";
String sql2= "{call PKG_Notice.updateNoticeContent(?,?,?)}";
int id = 0;
try {
conn = DatabaseFactory.getConnection();
sta = conn.prepareCall(sql);
int i = 1;
int length = mb.getContent().length();//内容长度
String content = "";
if(length>=2500){
content = mb.getContent().substring(0, 2499);
}else{
content = mb.getContent();
}
sta.setString(i++, mb.getTitle());
sta.setString(i++, mb.getDocnum());
sta.setString(i++, mb.getAuthor());
sta.setString(i++, content);
sta.registerOutParameter(i++, OracleTypes.NUMBER);
sta.execute();
id = sta.getInt(i-1);
//更新nclob字段
if(length>2500){
int times = length/2500;
for(int j=0;j<times;j++){
if(length>2500*j+4999){
content = mb.getContent().substring(2500*j+2499, 2500*j+4999);
}else{
content = mb.getContent().substring(2500*j+2499, length);
}
sta = conn.prepareCall(sql2);
sta.setLong(1, id);
sta.setLong(2, 2500*j+2499);//插入的开始偏移量
sta.setString(3, content);
sta.execute();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
return id;
}
?