1. java操作clob字段  
  2. 在oracle数据库中如何插入CLOB值 oracle中最常用的varcher2类型最多只能存储4000个字节的内容,一般情况下是能够满足用户的需求的。但是在一些特殊情况下(如要存储图片或者要存储的内容超过了4000个字节),varcher2就满足不了这个需求了。这个时候我们可以借助于oracle里面的大字段CLOB,后者 BLOB。举例如下: 首先,在数据库中建一张表news,为了简单起见,只有一个字段content(CLOB)。做好准备工作后就可以开始我们的CLOB之旅了。 以下是插入CLOB的代码:  
  3.  
  4. import java.sql.*;  
  5.  
  6. import java.io.*;  
  7.  
  8. public class TestClob{  
  9.  
  10. public void TestClob(){}  
  11.  
  12. public static void main(String args[]){  
  13.  
  14. try{  
  15.  
  16.      Class.forName("oracle.jdbc.driver.OracleDriver");  
  17.  
  18. Connectionconn=DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:ora32","tjpt","tjpt");     conn.setAutoCommit(false); //第一步:插入一个空的CLOB  
  19.  
  20. String sql1="insert into news(content,id) values (EMPTY_CLOB(),'1')";  
  21.  
  22. PreparedStatement ps1=conn.prepareStatement(sql1);  
  23.  
  24. ps1.executeUpdate(); ps1.close(); //第二步:取出该CLOB  
  25.  
  26. String sql2="select content from news for update";  
  27.  
  28. PreparedStatement ps2=conn.prepareStatement(sql2);  
  29.  
  30. ResultSet rs2=ps2.executeQuery();  
  31.  
  32. while (rs2.next()){  
  33.  
  34. oracle.sql.CLOB clob=(oracle.sql.CLOB)rs2.getClob(1);  
  35.  
  36. BufferedWriter out=new BufferedWriter(clob.getCharacterOutputStream());  
  37.  
  38. String content="1234";//假定这是新闻的内容,当然可以也可以是其他的内容  
  39.  
  40. out.write(content,0,content.length());  
  41.  
  42. out.close();  
  43.  
  44. }  
  45.  
  46. conn.commit();  
  47.  
  48. } catch(Exception e){e.printStackTrace();}  
  49.  
  50. }  
  51.  
  52. }  
  53.  
  54. 既然插入进去了,那我们还得要检验一下:插进去的是不是你想插进去的内容?以下就是读取CLOB的代码: import java.sql.*;  
  55.  
  56. import java.io.*;  
  57.  
  58. public class ReadClob{  
  59.  
  60. public void ReadClob(){}  
  61.  
  62. public static void main(String args[]){  
  63.  
  64. try{  
  65.  
  66. Class.forName("oracle.jdbc.driver.OracleDriver");  
  67.  
  68. Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ora32","tjpt","tjpt"); String sql1="select content from news";  
  69.  
  70. PreparedStatement ps1=conn.prepareStatement(sql1);  
  71.  
  72. ResultSet rs1=ps1.executeQuery();  
  73.  
  74. while (rs1.next()){  
  75.  
  76. oracle.sql.CLOB clob=(oracle.sql.CLOB)rs1.getClob(1);  
  77.  
  78. BufferedReader in=new BufferedReader(clob.getCharacterStream());  
  79.  
  80. StringWriter out=new StringWriter();  
  81.  
  82. int c;  
  83.  
  84. while((c=in.read())!=-1){  
  85.  
  86. out.write(c);  
  87.  
  88. }  
  89.  
  90. String content=out.toString();  
  91.  
  92. System.out.println (content);//输出CLOB内容 }  
  93.  
  94. } catch(Exception e){e.printStackTrace();  
  95.  
  96. }  
  97.  
  98. }  
  99.  
  100. }  
  101.  
  102.  
  103.  
  104. 例题2:插入  
  105.  
  106. //ReportEntity 存放数据的bean  
  107.  
  108. public boolean AddMonth_Report(ReportEntity re) throws Exception {  
  109. Connection conn = null;  
  110. Statement st = null;  
  111. ResultSet rs = null;  
  112.  
  113. 这个sql是先插入空值,占个位子  
  114.  
  115.                String sql =  
  116. "insert into staff_monthform(id,memb_id,m_plan,m_summery,m_date) values" 
  117. + " (SEQ_MID.nextval,'" +   re.getMEMB_ID()+  
  118. "',empty_clob(),empty_clob(),sysdate)";  
  119.  
  120. //clob型的字段要先以empty_clob()空值插入;然后用update把数据修改进去  
  121. try {  
  122. conn = ConnectionPool.getConnection();//连接池  
  123. conn.setAutoCommit(false);  
  124. st = conn.createStatement();  
  125. st.executeUpdate(sql);  
  126.  
  127. //这个sql执行的是update,先将该条记录锁定,再修改数据  
  128. String sql2 = "select m_plan from staff_monthform where memb_id='" +  
  129. re.getMEMB_ID() + "' "  
  130. +  
  131. " and   to_char(M_DATE,'mm')=to_char(sysdate,'mm') for update";  
  132. rs = st.executeQuery(sql2);  
  133. oracle.sql.CLOB clobtt = null;  
  134. if (rs.next()) {  
  135. try {  
  136. oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getObject(1); //clob  
  137. Writer outstream = clob.getCharacterOutputStream(); //字符 输出流  
  138. outstream.write(new String(re.getM_PLAN().getBytes(  
  139. "ISO8859_1"))); //写  
  140. outstream.close();  
  141.  
  142.                        } catch (Exception ex) {  
  143. ex.printStackTrace();  
  144. }  
  145.  
  146.                        return true;  
  147. }  
  148. conn.commit();  
  149.  
  150.                } catch (Exception ex) {  
  151. ex.printStackTrace();  
  152. } finally {  
  153. try {  
  154.  
  155.                        if (rs != null) {  
  156. rs.close();  
  157. }  
  158. if (st != null) {  
  159. st.close();  
  160. }  
  161. if (conn != null) {  
  162. ConnectionPool.close(conn);  
  163. }  
  164. } catch (Exception sqlex) {  
  165. Logger.error(sqlex.getMessage());  
  166. }  
  167.  
  168.                }  
  169. return false;  
  170. }  
  171.  
  172.  
  173.  
  174. 在s2sh操作clob字段时,更新的时候容易出现这种错误:  
  175.  
  176. 不允许的操作: streams type cannot be used in batching  
  177.  
  178.  
  179. 解决方法如下:  
  180.  
  181. 近日程序的数据库转为oracle 在操作blob类型时报以下错误:不允许的操作: streams type cannot be used in batching。经过查找多方面的资料查证Oracle JDBC不允许流操作以批量方式执行(Oracle CLOB采用流机制作为数据读写方式)。 只需在spring配置文件中更改hibernate jdbc.batch_size为0即可。  
  182.  
  183. <bean id="oracleSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">     
  184.         <property name="dataSource">     
  185.             <ref bean="oracleDataSource"/>     
  186.         </property>     
  187.         <property name="hibernateProperties">     
  188.             <props>     
  189.                 <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>     
  190.                 <prop key="connection.provider_class">     
  191.                     org.hibernate.connection.C3P0ConnectionProvider     
  192.                 </prop>     
  193.                 <prop key="hibernate.show_sql">true</prop>     
  194.                 <prop key="hibernate.cache.use_query_cache">true</prop>     
  195.                 <prop key="hibernate.cache.provider_class">     
  196.                     org.hibernate.cache.EhCacheProvider     
  197.                 </prop>     
  198.                 <prop key="hibernate.jdbc.batch_size">0</prop>     
  199.             </props>     
  200.         </property>    
  201. <bean id="oracleSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="oracleDataSource"/> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop> <prop key="connection.provider_class"> org.hibernate.connection.C3P0ConnectionProvider </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.cache.use_query_cache">true</prop> <prop key="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </prop> <prop key="hibernate.jdbc.batch_size">0</prop> </props> </property>