Jos*_*ber 7
我通過使用Java存儲(chǔ)過程在工作中解決了同樣的問題.這種方法中沒有涉及的分塊/連接,因?yàn)榫幋a/解碼的能力本身構(gòu)建在Java中,只需編寫一個(gè)簡單包裝Java方法的函數(shù)就可以正常運(yùn)行并且是高性能的,因?yàn)橹灰阋呀?jīng)執(zhí)行了幾次, JVM將Java proc編譯成低級(jí)代碼(高性能就像C存儲(chǔ)函數(shù)一樣).我稍后會(huì)編輯這個(gè)答案,并添加有關(guān)該Java代碼的詳細(xì)信息.
但是要退一步,請(qǐng)問為什么要將這些數(shù)據(jù)存儲(chǔ)為BLOB和編碼(CLOB)? 是因?yàn)槟锌蛻粝胍院笠环N格式使用數(shù)據(jù)嗎?我真的更喜歡只存儲(chǔ)BLOB格式.其中一個(gè)原因是編碼版本的大小可能是原始二進(jìn)制BLOB的兩倍,因此存儲(chǔ)它們可能意味著存儲(chǔ)量的3倍.
一個(gè)解決方案查看oracle編碼方式,我在工作中實(shí)現(xiàn)的,創(chuàng)建自己的Java存儲(chǔ)函數(shù)(),編碼二進(jìn)制 - > ,然后使用該函數(shù)在查詢時(shí)動(dòng)態(tài)編碼(它并不昂貴).從應(yīng)用程序/客戶端,您可以查詢類似的內(nèi)容 (image) FROM test WHERE ...
如果無法觸及應(yīng)用程序代碼(即COTS應(yīng)用程序)或者您的開發(fā)人員對(duì)使用函數(shù)不感興趣查看oracle編碼方式,您可以通過使用(計(jì)算)列來為它們抽象(因?yàn)槟褂玫氖?1g +)包含計(jì)算的表(image).它的功能類似于視圖,因?yàn)樗粫?huì)物理存儲(chǔ)編碼的CLOB,但會(huì)在查詢時(shí)生成它們.對(duì)于任何客戶,他們都無法告訴他們他們沒有閱讀物理專欄.另一個(gè)好處是,如果您更新了jpg(BLOB),則會(huì)立即自動(dòng)更新虛擬CLOB.如果您必須插入/更新/刪除大量BLOB,則可以節(jié)省66%的重做/存檔日志,而無需處理所有CLOB.
最后,為了提高性能,請(qǐng)確保使用 LOB(包括BLOB和CLOB).幾乎在所有方面,它們確實(shí)更快更好.
更新 - 我找到了我的代碼,至少是使用Java存儲(chǔ)過程執(zhí)行相反操作的版本(將編碼的CLOB轉(zhuǎn)換為其二進(jìn)制BLOB版本).編寫反轉(zhuǎn)并不困難.
--DROP FUNCTION base64_decode ;
--DROP java source base64;
-- This is a PLSQL java wrapper function
create or replace
FUNCTION base64_decode (
myclob clob)
RETURN blob

AS LANGUAGE JAVA
NAME 'Base64.decode (
oracle.sql.CLOB)
return oracle.sql.BLOB';
/
-- The Java code that base64 decodes a clob and returns a blob.
create or replace and compile java source named base64 as
import java.sql.*;
import java.io.*;
import oracle.sql.*;
import sun.misc.BASE64Decoder;
import oracle.jdbc.driver.*;

public class Base64 {
public static oracle.sql.BLOB decode(oracle.sql.CLOB myBase64EncodedClob)
{
BASE64Decoder base64 = new BASE64Decoder();
OutputStream outstrm = null;
oracle.sql.BLOB myBlob = null;
ByteArrayInputStream instrm = null;
try
{
if (!myBase64EncodedClob.equals("Null"))
{

Connection conn = new OracleDriver().defaultConnection();
myBlob = oracle.sql.BLOB.createTemporary(conn, false,oracle.sql.BLOB.DURATION_CALL);
outstrm = myBlob.getBinaryOutputStream();
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
InputStream in = myBase64EncodedClob.getAsciiStream();
int c;
while ((c = in.read()) != -1)
{
byteOutStream.write((char) c);
}
instrm = new ByteArrayInputStream(byteOutStream.toByteArray());

try // Input stream to output Stream
{
base64.decodeBuffer(instrm, outstrm);
}
catch (Exception e)
{
e.printStackTrace();
}
outstrm.close();
instrm.close();
byteOutStream.close();
in.close();
conn.close();

}
}
catch (Exception e)
{
e.printStackTrace();
}
return myBlob;
} // Public decode
} // Class Base64
;
/