搞了半天终于弄懂了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;
}
分享到:
相关推荐
对BLOB的常见操作包括插入、更新、查询和删除。使用PL/SQL过程和函数,如DBMS_LOB,可以进行更复杂的处理,如读取部分数据、追加数据或比较BLOB值。 2. CLOB(Character Large Object): CLOB是用于存储大文本...
ORA-01461 错误是 Oracle 数据库中的一种常见错误,错误信息为“仅可以为插入 LONG 列的 LONG 值赋值”。该错误通常是由于 Oracle 的 jar 包版本与 Oracle 数据库实际版本不匹配造成的。 在了解 ORA-01461 错误解决...
然而,当你尝试向CLOB字段插入数据时,如果超过了Oracle规定的最大限制,就会遇到“ORA-01704: 文字字符串过长”的错误。这个错误通常意味着你试图插入的字符串超过了Oracle数据库允许的最大长度,对于VARCHAR2类型...
更新CLOB数据类似于插入操作,但需要先获取现有的CLOB对象,然后使用`CLOB.setString()`方法修改其内容,最后使用`PreparedStatement`执行更新语句。示例中展示了如何使用`PreparedStatement`的`setClob()`方法来...
对于NCLOB类型的考核情况字段,可以从指定文件夹中的文本文件中随机抽取内容。最后,对于BLOB类型的照片字段,可以从文件夹中随机选择图片。 完成所有规则设定后,点击Run按钮,DataFactory将按照设定的规则批量...
- **Clob/NClob插入问题**: - 在使用NHibernate与Oracle交互时,如果使用的是`NHibernate.Driver.OracleClientDriver`,可能会遇到插入Clob或NClob数据失败的问题,特别是当数据量较大时。 - **解决方法**:改用`...
在Oracle数据库中,CLOB(Character Large Object)是一种用于存储大量文本数据的...以上就是Oracle中CLOB类型文字处理的相关知识点,涵盖从创建、插入、查询、更新到文件操作的全过程,希望对你的理解和实践有所帮助。
假设有一个应用程序需要频繁读取和更新一张表中的 CLOB 字段,该字段用于存储产品描述。为了提高性能,我们可以采取以下步骤: 1. **增大数据块大小**:将数据块大小从默认值 8KB 增大到 16KB 或更大,以减少 I/O ...
Oracle数据库提供了几种不同的LOB类型,包括BLOB(Binary Large Object)用于二进制数据,CLOB(Character Large Object)用于字符数据,NCLOB(National Character Large Object)用于Unicode字符数据。本篇将详细...
例如,给出的`updateclob`过程是一个动态更新Clob字段的例子,它接受表名、唯一标识字段名、Clob字段名、记录号、处理字符的起始位置以及要插入的字符串变量。该过程首先构建SQL查询语句,然后使用EXECUTE IMMEDIATE...
2. 对于 Oracle 数据库中的数据操作,我们可以使用 select 语句来实现数据的查询、插入、更新和删除操作。 3. 在 Oracle 中,select 语句可以用来查询数据,但不能用来改变或删除数据。 4. 在 Oracle 中,DUAL 表...
5. 更新记录:odyn.Update()。 6. 定义OBlob对象oblob。 7. 开始编辑含有LOB字段的新记录:odyn.StartEdit()。 8. 获取字段值并设置写入缓冲区:odyn.GetFieldValue("图像", &oblob)。 9. 分配合适的缓冲区,然后分...
Oracle数据库支持多种类型的LOB数据类型,包括BFILE、CLOB、BLOB和NCLOB,用于存储不同类型的数据。在本文中,作者主要探讨了使用BLOB类型存储图像的方法。 BLOB类型特别适合存储无结构的二进制数据,如图像、音频...
-- 初始化缓冲区以插入或更新数据 EXECUTE IMMEDIATE query_str INTO lob_loc USING v_id; -- 从pos位置开始,将32766个VARCHAR2写入lob_loc DBMS_LOB.WRITE(lob_loc, amt, pos, c_clob); COMMIT; ...
5. 使用OracleCommand对象执行INSERT或UPDATE操作,将数据插入或更新到数据库。 注意,由于LONG和BLOB字段不能在同一INSERT语句中一起插入,因此在处理这两种类型的数据时,可能需要分开进行。在上述示例中,可以...
默认字符集用于CHAR、VARCHAR、VARCHAR2、CLOB等类型的数据,而国家字符集服务于NCHAR、NVARCHAR、NVARCHAR2、NCLOB等类型,以处理多语言需求。例如,当数据库的默认字符集为ZHS16GBK,国家字符集为AL16UTF16时,...
- 包含在`bigstring_oracle_src`可能有示例代码,展示了如何在Java中创建Clob和Blob对象,以及如何通过Hibernate进行插入、更新和查询操作。 总之,理解并熟练掌握Hibernate对Oracle中的Clob和Blob字段的操作,是...
- **包含大字段的表**:当表空间名称发生变化时,含有CLOB、NCLOB或BLOB等大字段的表可能无法正常导出和导入。为解决这个问题,可以先手动创建表结构,然后通过数据导入的方式填充数据。 - **权限问题**:导入表时...
例如,使用`UTL_FILE`包读取本地文件并插入BFILE字段,或者直接插入CLOB或BLOB数据。 以存储图片为例,可以使用以下步骤: ```sql -- 创建表 CREATE TABLE image_table ( id NUMBER PRIMARY KEY, image BLOB ); ...