Java對Oracle中Clob資料類型是不能夠直接插入的,但是可以通過流的形式對clob類型資料寫入或者讀取,網上代碼並不算特別多,講的也不是很清楚,我對網上資料進行了整理和總結,具體看代碼:
寫入clob資料
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestClobIn {
public static void main(String args[]){
String data="this is a long passage!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
Writer outStream = null;
//通過JDBC獲得資料庫連接
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ewins", "scott", "tiger");
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個Null 物件empty_clob(),這個是必須的
st.executeUpdate("insert into TESTCLOB(ID, NAME, CLOBATTR)values(2,'thename', empty_clob())");
//鎖定資料行進行更新,注意“for update”語句,這裡不用for update鎖定不可以插入clob
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Clob對象後強制轉換為oracle.sql.CLOB
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");
outStream = clob.getCharacterOutputStream();
//data是傳入的字串,定義:String data
char[] c = data.toCharArray();
outStream.write(c, 0, c.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
讀取clob資料
import java.io.InputStream;
import java.io.Reader;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestClobOut {
public static void main(String args[]){
String data;
Reader inStream=null;
//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();//ConnectionFactory類是另外定義的,不必糾結
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要“for update”
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");
if (rs.next())
{
java.sql.Clob clob = rs.getClob("CLOBATTR");
inStream = clob.getCharacterStream();
char[] c = new char[(int) clob.length()];
inStream.read(c);
//data是讀出並需要返回的資料,類型是String
data = new String(c);
inStream.close();
}
inStream.close();
con.commit();
con.close();
}
}
對比我們可以看出,無論出庫入庫,都要對clob資料類型進行查詢操作,寫入clob資料相對來說更複雜一點,需要先插入empty_clob()值,然後使用帶“for update”的查詢語句鎖定更新行,最後執行個體化輸出資料流並對clob類型欄位資料進行寫入操作;讀取clob相對輕鬆一些,利用getCharacterStream方法得到輸入資料流,從資料庫中clob欄位下,直接將資料讀取出來。