CLOB (Character Large Object) 適用於儲存大型文本(如 XML、文件內容),最大 4GB。本文示範 JDBC 操作 CLOB 的標準流程:插入 EMPTY_CLOB()、取得定位器、寫入字元流、查詢讀取、SQL*Plus 驗證。
clobtest_table (id VARCHAR2, picstr CLOB)Connection conn,且 String strTmp 含待寫入大文本conn.setAutoCommit(false); String sql = "INSERT INTO clobtest_table(id, picstr) VALUES (?, EMPTY_CLOB())"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "001"); pstmt.executeUpdate(); pstmt.close(); // 取得 CLOB 定位器 sql = "SELECT picstr FROM clobtest_table WHERE id = '001' FOR UPDATE"; pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); oracle.sql.CLOB clob = null; if (rs.next()) clob = (oracle.sql.CLOB) rs.getClob(1); rs.close(); pstmt.close(); // 寫入字元資料 Writer writer = clob.getCharacterOutputStream(); writer.write(strTmp); writer.flush(); writer.close(); conn.commit();
SQL> SELECT DBMS_LOB.GETLENGTH(picstr) FROM clobtest_table;
String sql = "SELECT picstr FROM clobtest_table WHERE id = '001'";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
String description = "";
if (rs.next()) {
oracle.sql.CLOB clob = (oracle.sql.CLOB)
((oracle.jdbc.driver.OracleResultSet) rs).getClob(1);
if (clob == null || clob.length() == 0) {
description = "";
} else {
description = clob.getSubString(1L, (int) clob.length());
System.out.println("內容: " + description);
}
}
rs.close(); pstmt.close();
FOR UPDATE 鎖定列,否則定位器無效。oracle.sql.CLOB 而非標準 java.sql.Clob 以存取 getCharacterOutputStream()、getSubString() 等 Oracle 擴充方法。掌握 CLOB 標準操作模式,能安全高效處理大型文本資料。