Skip to content

Oracle CLOB Field 資料存取

三月 2, 2008

碰到一個問題是,資料會以 Character 的型態存入 Oracle 某張表的 CLOB 欄位,因為以前沒實際遇過處理這方面的問題,於是參考了 Oracle 網站所提供的 LOBSample 很快的便解決這個 issue。

寫入 CLOB 欄位時 Query Statement 字串的結尾加上 “FOR UPDATE" 的敘述代表要做 UPDATE 的動作,並且 Connection 物件設定把 AutoCommit 給關閉,以手動方式做 Commit,執行 Query() 後回傳的 ResultSet 物件可以用 getCLOB() 來取得指定的 CLOB 欄位。下面是個簡易的範例︰


dbConn.setAutoCommit(false);
Statement stmt = dbConn.createStatement();
ResultSet rs = stmt.executeQuery(queryStr);

if(rs.next())
{
oracle.sql.CLOB dataClob = (oracle.sql.CLOB) rs.getClob("OCR_TEXT");
Writer clobWriter = dataClob.getCharacterOutputStream();
File testFile = new File("C:/temp/debug.txt");
FileReader fReader = new FileReader(testFile);
length = String.valueOf(testFile.length());
char[] cbuffer = new char[Integer.parseInt(length)+1];
int nread = 0;
while( (nread= fReader.read(cbuffer)) != -1 )
{
clobWriter.write(cbuffer);
}
fReader.close();
clobWriter.close();
dbConn.commit();
}

而在做讀取的動作時,前半段的動作與上述方法類似,而後半段則看是要用 FileOutputStream 來寫入檔案或只以 ByteArrayOutputStream 的方式抓取成 String 字串。這邊則列出我做的方式做範例︰


if(rs.next())
{
oracle.sql.CLOB dataClob = (oracle.sql.CLOB) rs.getClob("OCR_TEXT");
LOGGER.debug("Get Clob Data.");

InputStream clobStream = dataClob.getAsciiStream();
StringBuffer contentBuffer = new StringBuffer();
OutputStream outStream = new ByteArrayOutputStream();

byte[] buffer = new byte[content_size+1];
int nbytes = 0;

while( (nbytes = clobStream.read(buffer)) != -1)
{
for(int i=0; i<nbytes-1; i++)
{
contentBuffer.append(Character.valueOf((char)buffer[i]));
}
}

String outputStr = replaceHTMLString(contentBuffer.toString());

outStream.close();
clobStream.close();
JDomUtil.addJdomContent(ocr_content_element, "content", outputStr);
}

主要就是讀取出來的是 byte 型態的值,所以會先用 Character.valueOf() 取得真正的 char 字元,然後一個一個收集起來。因為在我的 CLOB 欄位存的是 HTML 內容,因此讀取出來後我自己會再做一次 replace 的動作將特殊字元做個轉換,然後丟出 XML 資料。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: