J2EE操作Oracle的clob类型字段
关键字: java
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. }
/* 以下表PF_HELP_CONTENT中的HCONTENT字段时CLOB类型的 */
// 通过序列器生成帮助ID
Map map = Query.getMap("Select TO_CHAR(SEQ_HID.nextval) HID FROM DUAL ");
hid = String.valueOf(map.get("HID"));
//插入一条数据,注意CLOB字段,需要先插入一个空的clob类型 empty_clob(),然后再单独更新clob字段
sql = "Insert INTO PF_HELP_CONTENT(HID,HCONTENT) VALUES (?,empty_clob()) ";
try
{
//执行插入
rtn = DbUtils.executeUpdate(sql,hid);
/* 插入成功后,修改HCONTENT字段内容 */
//取得数据库连接
Connection conn = DbUtils.getConnection();
//手动提交
conn.setAutoCommit(false);
//定义ResultSet 和 Clob 变量
ResultSet rs = null;
oracle.sql.CLOB clob = null;
//更新SQL
String sqlclob = "Select HCONTENT FROM PF_HELP_CONTENT Where HID=? FOR Update ";
java.sql.PreparedStatement pstmt = conn.prepareStatement(sqlclob);
//hid是varchar2类型的,所以用setString
pstmt.setString(1,hid);
//执行update语句
rs= pstmt.executeQuery();
if(rs.next())
{
//取得刚才的HCONTENT的内容,也就是刚才添加的empty_clob()
clob = (oracle.sql.CLOB)rs.getClob(1);
}
//需要用clob.getCharacterOutputStream()流方式输出
Writer write = clob.getCharacterOutputStream();
//写入具体内容,helpform.getHContent() 存的是帮助的内容
write.write(helpform.getHContent());
write.flush();
write.close();
rs.close();
//提交
conn.commit();
conn.close();
}
catch(Exception ex)
{
//.........
}
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. }
/* 修改跟插入时基本一致,也是用for update来实现 */
//如果修改前的字段内容长度大于当前修改的长度时,末尾的部分内容仍然会存在
//所以在修改内容前,需要将PF_HELP_CONTENT内容置空
sql = " Update PF_HELP_CONTENT SET HCONTENT=empty_clob() Where HID=? ";
try
{
rtn = DbUtils.executeUpdate(sql,hid);
//以下操作跟添加时一样
Connection conn = DbUtils.getConnection();
conn.setAutoCommit(false);
ResultSet rs = null;
oracle.sql.CLOB clob = null;
String sqlclob = "Select HCONTENT FROM PF_HELP_CONTENT Where HID=? FOR Update ";
java.sql.PreparedStatement pstmt = conn.prepareStatement(sqlclob);
pstmt.setString(1,hid);
rs= pstmt.executeQuery();
if(rs.next())
{
clob = (oracle.sql.CLOB)rs.getClob(1);
}
Writer write = clob.getCharacterOutputStream();
write.write(helpform.getHContent());
write.flush();
write.close();
rs.close();
conn.commit();
conn.close();
}
catch(Exception ex)
{
//...
}
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);