`

NCLOB插入更新

阅读更多

      搞了半天终于弄懂了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;
	}
 
分享到:
评论

相关推荐

    oracle对大对象类型操作:blob,clob,nclob,bfile

    对BLOB的常见操作包括插入、更新、查询和删除。使用PL/SQL过程和函数,如DBMS_LOB,可以进行更复杂的处理,如读取部分数据、追加数据或比较BLOB值。 2. CLOB(Character Large Object): CLOB是用于存储大文本...

    ORA-01461 仅可以为插入 LONG 列的 LONG 值赋值”解决办法

    ORA-01461 错误是 Oracle 数据库中的一种常见错误,错误信息为“仅可以为插入 LONG 列的 LONG 值赋值”。该错误通常是由于 Oracle 的 jar 包版本与 Oracle 数据库实际版本不匹配造成的。 在了解 ORA-01461 错误解决...

    CLOB 字段类型报错 ORA-01704: 文字字符串过长的解决

    然而,当你尝试向CLOB字段插入数据时,如果超过了Oracle规定的最大限制,就会遇到“ORA-01704: 文字字符串过长”的错误。这个错误通常意味着你试图插入的字符串超过了Oracle数据库允许的最大长度,对于VARCHAR2类型...

    运用Java如何存取Oracle中的CLOB类型字段

    更新CLOB数据类似于插入操作,但需要先获取现有的CLOB对象,然后使用`CLOB.setString()`方法修改其内容,最后使用`PreparedStatement`执行更新语句。示例中展示了如何使用`PreparedStatement`的`setClob()`方法来...

    [数据生成工具]关于datafactory的介绍——即如何快速生成大批量数据[汇编].pdf

    对于NCLOB类型的考核情况字段,可以从指定文件夹中的文本文件中随机抽取内容。最后,对于BLOB类型的照片字段,可以从文件夹中随机选择图片。 完成所有规则设定后,点击Run按钮,DataFactory将按照设定的规则批量...

    NHibernate学习笔记

    - **Clob/NClob插入问题**: - 在使用NHibernate与Oracle交互时,如果使用的是`NHibernate.Driver.OracleClientDriver`,可能会遇到插入Clob或NClob数据失败的问题,特别是当数据量较大时。 - **解决方法**:改用`...

    Oracle中CLOB类型文字处理代码

    在Oracle数据库中,CLOB(Character Large Object)是一种用于存储大量文本数据的...以上就是Oracle中CLOB类型文字处理的相关知识点,涵盖从创建、插入、查询、更新到文件操作的全过程,希望对你的理解和实践有所帮助。

    Oracle Lob Performance Guidelines

    假设有一个应用程序需要频繁读取和更新一张表中的 CLOB 字段,该字段用于存储产品描述。为了提高性能,我们可以采取以下步骤: 1. **增大数据块大小**:将数据块大小从默认值 8KB 增大到 16KB 或更大,以减少 I/O ...

    Oracle的大对象处理(代码加注释)

    Oracle数据库提供了几种不同的LOB类型,包括BLOB(Binary Large Object)用于二进制数据,CLOB(Character Large Object)用于字符数据,NCLOB(National Character Large Object)用于Unicode字符数据。本篇将详细...

    oracle中blob 字段类型的应用

    例如,给出的`updateclob`过程是一个动态更新Clob字段的例子,它接受表名、唯一标识字段名、Clob字段名、记录号、处理字符的起始位置以及要插入的字符串变量。该过程首先构建SQL查询语句,然后使用EXECUTE IMMEDIATE...

    Oracle笔试题

    2. 对于 Oracle 数据库中的数据操作,我们可以使用 select 语句来实现数据的查询、插入、更新和删除操作。 3. 在 Oracle 中,select 语句可以用来查询数据,但不能用来改变或删除数据。 4. 在 Oracle 中,DUAL 表...

    用OO4O操作Oracle数据库的大数据字段 (1).pdf

    5. 更新记录:odyn.Update()。 6. 定义OBlob对象oblob。 7. 开始编辑含有LOB字段的新记录:odyn.StartEdit()。 8. 获取字段值并设置写入缓冲区:odyn.GetFieldValue("图像", &oblob)。 9. 分配合适的缓冲区,然后分...

    在Oracle数据库中存取图像的实现.pdf

    Oracle数据库支持多种类型的LOB数据类型,包括BFILE、CLOB、BLOB和NCLOB,用于存储不同类型的数据。在本文中,作者主要探讨了使用BLOB类型存储图像的方法。 BLOB类型特别适合存储无结构的二进制数据,如图像、音频...

    关于oracle中大对象处理的一些方法和实例.txt

    -- 初始化缓冲区以插入或更新数据 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; ...

    ORACLE数据库中主要字段类型的读写例子(包括:Long、Raw、Blob) (2).docx

    5. 使用OracleCommand对象执行INSERT或UPDATE操作,将数据插入或更新到数据库。 注意,由于LONG和BLOB字段不能在同一INSERT语句中一起插入,因此在处理这两种类型的数据时,可能需要分开进行。在上述示例中,可以...

    Oracle 数据库多语言入库问题的解决方案

    默认字符集用于CHAR、VARCHAR、VARCHAR2、CLOB等类型的数据,而国家字符集服务于NCHAR、NVARCHAR、NVARCHAR2、NCLOB等类型,以处理多语言需求。例如,当数据库的默认字符集为ZHS16GBK,国家字符集为AL16UTF16时,...

    Hibernate操作Oarcle中Clob、Blob字段小结

    - 包含在`bigstring_oracle_src`可能有示例代码,展示了如何在Java中创建Clob和Blob对象,以及如何通过Hibernate进行插入、更新和查询操作。 总之,理解并熟练掌握Hibernate对Oracle中的Clob和Blob字段的操作,是...

    解决oracle10以上版本导出空表失败的问题

    - **包含大字段的表**:当表空间名称发生变化时,含有CLOB、NCLOB或BLOB等大字段的表可能无法正常导出和导入。为解决这个问题,可以先手动创建表结构,然后通过数据导入的方式填充数据。 - **权限问题**:导入表时...

    浅论大型数据对象在Oracle数据库中的存储方法.pdf

    例如,使用`UTL_FILE`包读取本地文件并插入BFILE字段,或者直接插入CLOB或BLOB数据。 以存储图片为例,可以使用以下步骤: ```sql -- 创建表 CREATE TABLE image_table ( id NUMBER PRIMARY KEY, image BLOB ); ...

Global site tag (gtag.js) - Google Analytics