在java + oracle环境下,对于clob类型的数据的插入

转载 2011年09月16日 15:28:21
 

SQL 类型 CLOB 在 JavaTM 编程语言中的映射关系。SQL CLOB 是内置类型,它将 Character Large Object 存储为数据库表的某一行中的一个列值。默认情况下,驱动程序使用 SQL locator(CLOB) 实现 Clob 对象,这意味着 CLOB 对象包含一个指向 SQL CLOB 数据而不是数据本身的逻辑指针。Clob 对象在它被创建的事务处理期间有效。

CLOB 接口提供某些方法来获得 SQL CLOB (Character Large Object) 值长度、在客户端实现 CLOB 值以及搜索子字符串或 CLOB 值中的 CLOB 对象。接口 ResultSetCallableStatement  PreparedStatement 中的方法(如 getClob  setClob)允许编程人员访问 SQL CLOB 值。此外,此接口还拥有更新 CLOB 值的方法。

 

 

Oracle中,Varchar2支持的最大字节数为4KB,所以对于某些长字符串的处理,我们需要用CLOB类型的字段,CLOB字段最大支持4GB。 
还有其他几种类型: 
blob:二进制,如果exe,zip 
clob:单字节码,比如一般的文本文件. 
nlob:多字节码,如UTF格式的文件. 
以下就是对CLOG字段的操作方法,在我们的项目中帮助文档部分用到。 
1、首先是写入

Java代码 复制代码
  1. /* 以下表PF_HELP_CONTENT中的HCONTENT字段时CLOB类型的 */  
  2. // 通过序列器生成帮助ID    
  3. Map map = Query.getMap("Select TO_CHAR(SEQ_HID.nextval) HID FROM DUAL ");    
  4. hid = String.valueOf(map.get("HID"));    
  5. //插入一条数据,注意CLOB字段,需要先插入一个空的clob类型 empty_clob(),然后再单独更新clob字段    
  6. sql = "Insert INTO PF_HELP_CONTENT(HID,HCONTENT) VALUES (?,empty_clob())  ";    
  7. try  
  8. {              
  9.      //执行插入    
  10.      rtn = DbUtils.executeUpdate(sql,hid);        
  11.      /* 插入成功后,修改HCONTENT字段内容 */  
  12.      //取得数据库连接                             
  13.      Connection conn = DbUtils.getConnection();    
  14.      //手动提交    
  15.      conn.setAutoCommit(false);    
  16.      //定义ResultSet 和 Clob 变量    
  17.      ResultSet rs = null;    
  18.      oracle.sql.CLOB clob = null;    
  19.      //更新SQL    
  20.      String sqlclob = "Select HCONTENT FROM PF_HELP_CONTENT Where HID=? FOR Update ";    
  21.      java.sql.PreparedStatement pstmt = conn.prepareStatement(sqlclob);    
  22.      //hid是varchar2类型的,所以用setString    
  23.      pstmt.setString(1,hid);    
  24.      //执行update语句    
  25.      rs= pstmt.executeQuery();    
  26.      if(rs.next())    
  27.      {    
  28.         //取得刚才的HCONTENT的内容,也就是刚才添加的empty_clob()    
  29.         clob = (oracle.sql.CLOB)rs.getClob(1);    
  30.      }    
  31.      //需要用clob.getCharacterOutputStream()流方式输出    
  32.      Writer write = clob.getCharacterOutputStream();    
  33.      //写入具体内容,helpform.getHContent() 存的是帮助的内容    
  34.      write.write(helpform.getHContent());    
  35.      write.flush();    
  36.      write.close();    
  37.      rs.close();    
  38.      //提交    
  39.      conn.commit();    
  40.      conn.close();    
  41. }    
  42. catch(Exception ex)    
  43. {    
  44.     //.........    
  45. }  
Java代码 复制代码
  1. /* 以下表PF_HELP_CONTENT中的HCONTENT字段时CLOB类型的 */  
  2. // 通过序列器生成帮助ID    
  3. Map map = Query.getMap("Select TO_CHAR(SEQ_HID.nextval) HID FROM DUAL ");    
  4. hid = String.valueOf(map.get("HID"));    
  5. //插入一条数据,注意CLOB字段,需要先插入一个空的clob类型 empty_clob(),然后再单独更新clob字段    
  6. sql = "Insert INTO PF_HELP_CONTENT(HID,HCONTENT) VALUES (?,empty_clob())  ";    
  7. try  
  8. {              
  9.      //执行插入    
  10.      rtn = DbUtils.executeUpdate(sql,hid);        
  11.      /* 插入成功后,修改HCONTENT字段内容 */  
  12.      //取得数据库连接                             
  13.      Connection conn = DbUtils.getConnection();    
  14.      //手动提交    
  15.      conn.setAutoCommit(false);    
  16.      //定义ResultSet 和 Clob 变量    
  17.      ResultSet rs = null;    
  18.      oracle.sql.CLOB clob = null;    
  19.      //更新SQL    
  20.      String sqlclob = "Select HCONTENT FROM PF_HELP_CONTENT Where HID=? FOR Update ";    
  21.      java.sql.PreparedStatement pstmt = conn.prepareStatement(sqlclob);    
  22.      //hid是varchar2类型的,所以用setString    
  23.      pstmt.setString(1,hid);    
  24.      //执行update语句    
  25.      rs= pstmt.executeQuery();    
  26.      if(rs.next())    
  27.      {    
  28.         //取得刚才的HCONTENT的内容,也就是刚才添加的empty_clob()    
  29.         clob = (oracle.sql.CLOB)rs.getClob(1);    
  30.      }    
  31.      //需要用clob.getCharacterOutputStream()流方式输出    
  32.      Writer write = clob.getCharacterOutputStream();    
  33.      //写入具体内容,helpform.getHContent() 存的是帮助的内容    
  34.      write.write(helpform.getHContent());    
  35.      write.flush();    
  36.      write.close();    
  37.      rs.close();    
  38.      //提交    
  39.      conn.commit();    
  40.      conn.close();    
  41. }    
  42. catch(Exception ex)    
  43. {    
  44.     //.........    
  45. }  


2、修改CLOB字段内容 

Java代码 复制代码
  1. /* 修改跟插入时基本一致,也是用for update来实现 */  
  2. //如果修改前的字段内容长度大于当前修改的长度时,末尾的部分内容仍然会存在    
  3. //所以在修改内容前,需要将PF_HELP_CONTENT内容置空    
  4. sql = " Update PF_HELP_CONTENT SET HCONTENT=empty_clob() Where HID=? ";    
  5. try  
  6. {          
  7.  rtn = DbUtils.executeUpdate(sql,hid);    
  8.  //以下操作跟添加时一样                                   
  9.  Connection conn = DbUtils.getConnection();    
  10.  conn.setAutoCommit(false);    
  11.  ResultSet rs = null;    
  12.  oracle.sql.CLOB clob = null;    
  13.  String sqlclob = "Select HCONTENT FROM PF_HELP_CONTENT Where HID=? FOR Update ";    
  14.  java.sql.PreparedStatement pstmt = conn.prepareStatement(sqlclob);    
  15.  pstmt.setString(1,hid);    
  16.  rs= pstmt.executeQuery();    
  17.  if(rs.next())    
  18.  {    
  19.     clob = (oracle.sql.CLOB)rs.getClob(1);    
  20.  }    
  21.  Writer write = clob.getCharacterOutputStream();    
  22.  write.write(helpform.getHContent());    
  23.  write.flush();    
  24.  write.close();    
  25.  rs.close();    
  26.  conn.commit();    
  27.  conn.close();                                    
  28. }    
  29. catch(Exception ex)    
  30. {    
  31.   //...    
  32. }  
Java代码 复制代码
  1. /* 修改跟插入时基本一致,也是用for update来实现 */  
  2. //如果修改前的字段内容长度大于当前修改的长度时,末尾的部分内容仍然会存在    
  3. //所以在修改内容前,需要将PF_HELP_CONTENT内容置空    
  4. sql = " Update PF_HELP_CONTENT SET HCONTENT=empty_clob() Where HID=? ";    
  5. try  
  6. {          
  7.  rtn = DbUtils.executeUpdate(sql,hid);    
  8.  //以下操作跟添加时一样                                   
  9.  Connection conn = DbUtils.getConnection();    
  10.  conn.setAutoCommit(false);    
  11.  ResultSet rs = null;    
  12.  oracle.sql.CLOB clob = null;    
  13.  String sqlclob = "Select HCONTENT FROM PF_HELP_CONTENT Where HID=? FOR Update ";    
  14.  java.sql.PreparedStatement pstmt = conn.prepareStatement(sqlclob);    
  15.  pstmt.setString(1,hid);    
  16.  rs= pstmt.executeQuery();    
  17.  if(rs.next())    
  18.  {    
  19.     clob = (oracle.sql.CLOB)rs.getClob(1);    
  20.  }    
  21.  Writer write = clob.getCharacterOutputStream();    
  22.  write.write(helpform.getHContent());    
  23.  write.flush();    
  24.  write.close();    
  25.  rs.close();    
  26.  conn.commit();    
  27.  conn.close();                                    
  28. }    
  29. catch(Exception ex)    
  30. {    
  31.   //...    
  32. }  



3、取出CLOB字段的文本内容

Java代码 复制代码
  1. /* 前面部分都一致 */  
  2. Connection conn = DbUtils.getConnection();    
  3. conn.setAutoCommit(false);    
  4. ResultSet rs = null;    
  5. oracle.sql.CLOB clob = null;    
  6. String sqlclob = "Select HCONTENT FROM PF_HELP_CONTENT Where HID=? ";    
  7. java.sql.PreparedStatement pstmt = conn.prepareStatement(sqlclob);    
  8. pstmt.setString(1,hid);    
  9. rs= pstmt.executeQuery();    
  10. if(rs.next())    
  11. {    
  12.     //rs.getClob(1)中参数1指的是HCONTENT字段索引,第一个字段从1开始而不是从0。    
  13.     //也可以用字段名来取rs.getClob("HCONTENT")    
  14.     clob = (oracle.sql.CLOB)rs.getClob(1);    
  15. }    
  16. if(clob==null || clob.length()==0)    
  17. {    
  18.     hcontent = "";    
  19. }else  
  20. {    
  21.     //取CLOB字段内容为字符串    
  22.     hcontent=clob.getSubString((long)1,(int)clob.length());    
  23. }    
  24. rs.close();    
  25. conn.close();    
  26. request.setAttribute("HCONTENT",hcontent); 

 

Oracle 插入clob类型的数据

  • malinjie66
  • malinjie66
  • 2014年01月14日 17:08
  • 846

向oracle插入CLOB型数据

//向数据库插入CLOB类型数据     public static void insertClob(String dbName, String clobContent){ String inse...
  • xukaixun005
  • xukaixun005
  • 2016年11月21日 15:22
  • 836

Oracle中Clob类型处理解析

   最近利用NHibernate映射类型为Clob字段在插入数据时发现当字符的字节数(一个半角字符一个字节,一个全角字符两个字节)在2000-4000之间时报错(ORA-01461:仅可以插入LON...
  • pojianbing
  • pojianbing
  • 2008年08月09日 08:52
  • 28143

在oracle数据库中如何插入CLOB值

轉貼:http://blog.csdn.net/cmtobby/oracle中最常用的varcher2类型最多只能存储4000个字节的内容,一般情况下是能够满足用户的需求的。但是在一些特殊情况下(如要...
  • fenglibing
  • fenglibing
  • 2006年04月19日 16:53
  • 17030

java操作数据库中clob类型 之插入和查询

一、插入 1)对于clob字段,首先插入empty_clob(); String sql = " insert into batchintfloadlog (centercode,filename,p...
  • u011897392
  • u011897392
  • 2015年11月17日 16:52
  • 1715

jdbc插入修改clob类型的两种方式

方法一: Connection con = dbl.loadConnection(); strSql = "insert into table1(id,a) values (1,EMPTY_CLOB(...
  • u012316120
  • u012316120
  • 2015年07月12日 15:44
  • 1694

Oracle 插入超4000字节的CLOB字段的处理方法

我们可以通过创建单独的OracleCommand来进行指定的插入,即可获得成功,这里仅介绍插入clob类型的数据,blob与此类似,这里就不介绍了,下面介绍两种办法 在通过拼组sql语句来实现数据插...
  • xiaomaguohe26
  • xiaomaguohe26
  • 2013年12月19日 10:28
  • 1697

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

这是我几年前写的文章了,一直没有发出来。今天给大家分享。大家从这个例子如手吧。这个例子,存和取都很明白了  import java.sql.*; import java.io.*; import or...
  • etre
  • etre
  • 2003年07月20日 13:15
  • 6221

Oracle 插入CLOB字段的简易写法(纯脚本操作插入到CLOB字段)

版本:oracle 10g,11g 操作方式:spring jdbctemplate / jdbc 需求:项目模块中需要将字符插入到数据库,起初字符只有几百个字符,随着项目的进展,出现了4...
  • yygg329405
  • yygg329405
  • 2017年02月08日 15:14
  • 5315

java插入内容进入oracle的clob字段

1. 背景自己在拷贝数据表内容,进入另外一个数据库时。2. 说明java给oracle的clob字段插入内容。3. 代码片段获取clob字段内容:public static ArrayList doE...
  • loongshawn
  • loongshawn
  • 2016年01月05日 22:31
  • 4260
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在java + oracle环境下,对于clob类型的数据的插入
举报原因:
原因补充:

(最多只允许输入30个字)