JDBC操作CLOB类型字段
CLOB(Character Large Object) 存储为数据库表某一行中的一个列值。
java.sql.Clob接口提供一些方法来获SQL CLOB (Character Large Object) 值长度、在客户端实现 CLOB 值、搜索 CLOB 值中的子字符串或 CLOB 对象、更新 CLOB 值等。
接口 ResultSet、CallableStatement 和 PreparedStatement 中的方法(如 getClob 和 setClob)允许编程人员访问 SQL CLOB 值。
1 import java.sql.DriverManager; 2 import java.sql.Connection; 3 import java.sql.PreparedStatement; 4 import java.sql.ResultSet; 5 import java.sql.Clob; 6 import java.io.Writer; 7 import java.io.Reader; 8 9 public class Test { 10 public static void main(String[] args) throws Exception{ 11 Class.forName("oracle.jdbc.driver.OracleDriver"); 12 Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "LinuSiyu", "Siyux"); 13 14 insertClob(conn); 15 readClob(conn); 16 17 conn.close(); 18 } 19 20 static void insertClob(Connection conn) throws Exception { 21 conn.setAutoCommit(false); 22 PreparedStatement ps= conn.prepareStatement("SELECT CLOB_TEXT FROM TB_CLOB_TEST WHERE ID=? FOR UPDATE"); 23 ps.setInt(1, 123); 24 ResultSet rs = ps.executeQuery(); 25 Clob clob = null; 26 if(rs.next()) { 27 clob = rs.getClob(1); 28 } 29 String str = "123abc一二三"; 30 clob.setString(1, str); 31 32 String str3 = "三"; 33 Writer writer = clob.setCharacterStream(7); 34 writer.write(str3); 35 writer.flush(); 36 writer.close(); 37 38 rs.close(); 39 conn.commit(); 40 ps.close(); 41 } 42 43 static void readClob(Connection conn) throws Exception{ 44 PreparedStatement ps = conn.prepareStatement("SELECT CLOB_TEXT FROM TB_CLOB_TEST WHERE ID=?"); 45 ps.setInt(1, 123); 46 ResultSet rs = ps.executeQuery(); 47 if(rs.next()) { 48 Clob clob = rs.getClob("METRICSRESULT"); 49 Reader rd = clob.getCharacterStream(); 50 int len = 10; 51 char [] str = new char[10]; 52 while(true){ 53 int i = rd.read(str); 54 if(i == -1) 55 break; 56 if(i < len){ 57 for( int j = 0; j < i; j++) 58 System.out.print(str[j]); 59 break; 60 } 61 System.out.print(str); 62 } 63 System.out.println(); 64 } 65 } 66 }
setString(long pos, String str)将字符串str插入clob的第pos个字符位置,pos最前边的字符为第1个,pos不可以小于1; 插入时会从第pos个字符开始向后覆盖,覆盖不到的字符不受影响。 如果pos值大于clob值的长度+1,行为是不确定的,oracle的JDBC实现是使用空格补齐长度,并执行插入,其它数据库实现有可能抛出异常。