天天看點

oracle資料庫的大字段,Oracle資料庫大字段問題

Oracle資料庫大字段問題

問題描述:字段内容長度超4000

最近項目中存在用某些字段存預處理sql語句,最初,項目此類型字段用varchar2(4000),但随着項目跟進到二期,牽連的表越來越多,存在預處理索引,中間臨時表的問題,預處理SQL字段長度超過4000。

oracel預設varchar2類型是不能超過4000的

我們都知道,oracel預設varchar2類型是不能超過4000的,如果類型超過4000的資料插入會自動轉為long型資料插入,是以問題來了。

是以我将表中需要超過4000内容的字段該文long型,接下來問題又來了。

oracle一個表中最多隻能有一個long型字段

我們又知道,oracle一個表中最多隻能有一個long型字段,是以這種解決方案又不适合解決業務需求了,經查詢oracle推薦用clob字段類型存儲。

這裡需要簡單普及一下clob和blob的知識:CLOB(Character Large Object) 字元大對象,Blob(Binary Large Object)二進制大對象。

由字面意思可以簡單的辨識根據需求選擇不同的對應類型,我們項目中這個字段全是文字形式的預處理sql,是以選擇了clob,如果在遇到檔案、視訊、音頻等可以選擇blob哈。

好吧,既然oracle推薦使用這種clob方式存儲超4000的字元内容,那我就選擇呗。

接下來問題又來了:這是一種對象存儲方式,如何存取呢?

簡單的舉個栗子吧:

為了使用友善我們肯定要進行資料封裝,簡單寫個類似bean

Class User

Clob sqla;

Clob sqlb;

以及對應的set get方法。

我們在周遊查詢結果集ResultSet的時候将對應的結果user.setClob(rs.getClob(“sqla”));

因為我們要用clob裡面的内容資訊,将Clob轉為String使用呗

這就對了塞。在user對象能存儲進sqla這個clob對象了吧,是我們就将其取出來用呗,

簡單測試一下System.out.println(user.getSqla().toString());

這我們都知道,這列印出來是對象位址對吧。

查詢了下怎麼将clob轉String,我在用的時候将clob轉為String使用呗,就查了一下寫工具類,友善使用的時候調用

public static String clobToString(CLOB clob) throws SQLException, IOException {

result clob != null ? clob.getSubString(1, (int) clob.length()): null;

}

當jdbc傳回給我user對象後我在使用的地方調用clobToString(user.getSqls()),抛出的異常是:連接配接資料庫才能操作。

寫了一個stringToClob(String string) 方法傳回Clob對象,關鍵代碼如下:

new javax.sql.rowset.serial.SerialClob(s.toCharArray());這就是将字元串變為char數組利用jdbcApi轉換。

在使用的地方調用同樣報出需要連接配接資料庫才能操作。

是以經研究發現,在jdbc外面String與clob互轉是會出錯的。

整文的核心:将轉換代碼在jdbc 操縱是使用。