(Clob的寫入和讀取-java)更新數據庫報錯:SQL Error: 1461, SQLState: 72000 ORA-01461: 僅能綁定要插入 LONG 列的 LONG 值


原 因:某一個字段本為varchar2(1024),但是實際要插入的值超過varchar2允許的最大長度4000時,oracle自動將該字段值轉化為Long類型,然后提示插入操作失敗。

解決辦法:

    1)是不是真的要插入超過定義長度的值?否則對長度做判斷,截取等。

    2)若是,則將字段采用clob、blob,或者使用文件代替,字段保存文件地址即可。

 

對於clob、blob

 

CLOB 定義

  數據庫中的一種保存文件所使用的類型。

  Character Large Object

  SQL 類型 CLOB 在 JavaTM 編程語言中的映射關系。SQL CLOB 是內置類型,它將字符大對象 (Character Large Object) 存儲為數據庫表某一行中的一個列值。默認情況下,驅動程序使用 SQL locator(CLOB) 實現 Clob 對象,這意味着 CLOB 對象包含一個指向 SQL CLOB 數據的邏輯指針而不是數據本身。Clob 對象在它被創建的事務處理期間有效。

  在一些數據庫系統里,也使用Text 作為CLOB的別名,比如SQL Server

BLOB的含義

  BLOB (binary large object),二進制大對象,是一個可以存儲二進制文件的容器。

  在計算機中,BLOB常常是數據庫中用來存儲二進制文件的字段類型。

  BLOB是一個大文件,典型的BLOB是一張圖片或一個聲音文件,由於它們的尺寸,必須使用特殊的方式來處理(例如:上傳、下載或者存放到一個數據庫)。

  根據Eric Raymond的說法,處理BLOB的主要思想就是讓文件處理器(如數據庫管理器)不去理會文件是什么,而是關心如何去處理它。

但也有專家強調,這種處理大數據對象的方法是把雙刃劍,它有可能引發一些問題,如存儲的二進制文件過大,會使數據庫的性能下降。在數據庫中存放體積較大的多媒體對象就是應用程序處理BLOB的典型例子。

CLOB和BLOB的區別

  CLOB使用CHAR來保存數據。 如:保存XML文檔。

       BLOB就是使用二進制保存數據。 如:保存位圖。

 

JAVA里面對CLOB的操作

  在絕大多數情況下,使用2種方法使用CLOB

  1 相對比較小的

    可以用String進行直接操作,把CLOB看成字符串類型即可

  2 如果比較大

    1)如果使用jdbc則,可以用 getAsciiStream 或者 getUnicodeStream 以及對應的 setAsciiStream 和 setUnicodeStream 即可)

    2)clob怎么和Hibernate一起使用(參考原文:http://www.tuicool.com/articles/fumQfe )

      a)Clob類型的屬性的賦值方式—— String轉Clob

        String content = request.getParameter("content");//1.從request請求中取值(String類型的)         Clob clob = Hibernate.createClob(content);//2.通過hibernate將string轉化為clob         news.setContent(clob);//3.給實體類對應屬性賦值

      b)Clob類型的屬性的取值方式—— Clob轉String

        List<News> list = query.addEntity(News.class).list();//1.從數據庫取值         News news = (News)list.get(0);//2.取News對象         String content = ClobUtil.ClobToString(news.getContent());//3.將news對象中的clob類型的content轉化為String字符串
      
 1 -----------------   ClobUtil    -----------------------
 2 
 3 public class ClobUtil {
 4   public static String ClobToString(Clob clob) {
 5         String clobStr = "";
 6         Reader is = null;
 7         try {
 8   is = clob.getCharacterStream();
 9           // 得到流
10           BufferedReader br = new BufferedReader(is);
11           String s = null;
12   s = br.readLine();
13           StringBuffer sb = new StringBuffer();
14           //執行循環將字符串全部取出賦值給StringBuffer,由StringBuffer轉成String
15           while (s != null) {
16     sb.append(s);
17     s = br.readLine();
18           }
19           clobStr = sb.toString();
20         } catch (IOException e) {
21   e.printStackTrace();
22         } catch (SQLException e) {
23   e.printStackTrace();
24         }
25         return clobStr;
26     }
27 }
28 
29 注意:通過流的方式讀取Clob類型數據

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM