1. 程式人生 > >Oracle中對clob型別欄位的操作

Oracle中對clob型別欄位的操作

下面這篇文章說的很詳細,我再做兩點補充說明:
        第一,LOB資料不能象其它型別資料一樣直接插入(INSERT)。插入前必須先插入一個空的LOB物件,CLOB型別的空物件為EMPTY_CLOB()BLOB型別的空物件為EMPTY_BLOB()。之後通過SELECT命令查詢得到先前插入的記錄並鎖定,繼而將空物件修改為所要插入的LOB物件。
        第二,在插入到更新之間一定要將自動提交設為false否則,再次查詢時就不能正確更新,查詢時一定要用select XXX from table where id='XXX' for update 如果不加for update會報:“row containing the LOB value is not locked

”;如果在插入前沒有將自動提交設為false會報“fetch out of sequence ”。注意到以上兩點一般就可以順利插入clob型欄位了。

---------------------------------------------------------------------------------------------------------
以下程式碼和文字是網上搞抄的別人的文章,再此謝過原作者。
----------------------------------------------------------------------------------------------------------

 最近在
J2EE的專案中需要使用LOB欄位儲存文字資訊以及圖片和檔案,到網上搜拉一下,還不少,仔細看拉一下,但都不是很全有的還有錯誤,經過幾天的實踐,把問題都解決拉,順便總結一下,希望對需要的朋友有點參考

LOB中我們用的比較多的主要有兩種CLOBBLOB,我們對兩種型別分別討論

1.CLOB是字元型LOB,主要儲存文字資訊,,最長為4G.,J2EE程式中,比如網頁的textarea中的字元資訊比較長,Varchar2欄位型別不能滿足時,我們就得用CLOB資料型別,我們這次專案中就碰到這種情況.現在我們先說說如何存取CLOB欄位

現在我要把網頁中的textarea元素的資訊儲存到資料庫的CLOB欄位中,

我們都知道textarea中的資訊當然不能直接儲存成CLOB,我們在後臺得到的是String型別的

有關oracle欄位型別的相關資訊可以查閱oracle技術網。下面摘抄一些有關blob.clob等型別的說明。又便於大家的瞭解。
欄位型別:blob,clob,nclob
說明:三種大型物件(LOB),用來儲存較大的圖形檔案或帶格式的文字檔案,如Miceosoft Word文件,以及音訊、視訊等非文字檔案,最大長度是4GB。LOB有幾種型別,取決於你使用的位元組的型別,Oracle 8i實實在在地將這些資料儲存在資料庫內部儲存。可以執行讀取、儲存、寫入等特殊操作。

我們所操作的clobtest_table中屬性是(字元型id,CLOB型picstr),目前我們假設一個大的字元物件str已經包含了我們需要存入picstr欄位的資料。而且connection物件conn已經建立。以下的例子程式也因為不想佔用太多的空間,所以對丟擲異常沒有寫。大家參考一下api doc。就可以知道該丟擲什麼異常了,此處僅僅告訴大家如何去寫。

程式碼:
 
 
(1)對資料庫clob型執行插入操作
*************************************************
 
java.sql.PreparedStatement pstmt = null;
ResultSet rs = null;
String query = "";
 
conn.setAutoCommit(false);
       query = "insert into clobtest_table(id,picstr) values(?,empty_clob())";
java.sql.PreparedStatement pstmt = conn.prepareStatement(query);
pstmt.setString(1,"001");
pstmt.executeUpdate();
pstmt = null
       query = "select picstr from clobtest_table where id = '001' for update";
pstmt = con.prepareStatement(query)
rs= pstmt.executeQuery();
 
oracle.sql.CLOB clobtt = null;
if(rs.next()){
    clobtt = (oracle.sql.CLOB)rs.getClob(1);
}
Writer wr = clobtt.getCharacterOutputStream();
wr.write(strtmp);
wr.flush();
wr.close();
rs.close();
con.commit();
 
 
 
(2)通過sql/plus查詢是否已經成功插入資料庫
*************************************************
 
PL/SQL的包DBMS_LOB來處理LOB資料。察看剛才的插入是否成功。使用DBMS_LOB包的getlength這個procedure來檢測是否已經將str存入到picstr欄位中了。如:
 
SQL> select dbms_lob.getlength(picstr) from clobtest_table;
 
 
(3)對資料庫clob型執行讀取操作
*************************************************
 
讀取相對插入就很簡單了。基本步驟和一半的取資料庫資料沒有太大的差別。
String description = ""
      query = "select picstr from clobtest_table where id = '001'";
pstmt = con.prepareStatement(query);
ResultSet result = pstmt.executeQuery();
if(result.next()){
    oracle.jdbc.driver.OracleResultSet ors =  
              (oracle.jdbc.driver.OracleResultSet)result;
    oracle.sql.CLOB clobtmp = (oracle.sql.CLOB) ors.getClob(1);
 
    if(clobtmp==null || clobtmp.length()==0){
        System.out.println("======CLOB物件為空 ");
        description = "";
    }else{
        description=clobtmp.getSubString((long)1,(int)clobtmp.length());
        System.out.println("======字串形式 "+description);
    }
}