3 回答

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
這是我實(shí)施的臨時(shí)解決方案,因?yàn)槲医咏刂谷掌冢胰栽趯ふ乙粋€(gè)解決方案,其中我不必使用不推薦使用的類(lèi),并且希望避免引用 oracle.sql.BLOB 并使用 java .sql.Blob。
解決方法涉及創(chuàng)建一個(gè) oracle.sql.BLOB 對(duì)象而不是 SerialBlob,然后從輸出流中填充 bytearray,如下所示,
conn = new OracleDriver().defaultConnection();
desBlob = BLOB.createTemporary(conn, false, BLOB.DURATION_SESSION);
desBlob.setBytes(1, pdfDocumentOutputStream.toByteArray());
并使用抑制棄用警告,
@SuppressWarnings("deprecation")
最終的 Java 代碼
@SuppressWarnings("deprecation")
public static java.sql.Blob Convert_Image(java.sql.Blob srcBlob) {
java.sql.Blob desBlob = null;
try {
Document document = new Document();
ByteArrayOutputStream pdfDocumentOutputStream = new ByteArrayOutputStream();
PdfWriter pdfDocumentWriter = PdfWriter.getInstance(document, pdfDocumentOutputStream);
document.open();
if (document.newPage()) {
int indentation = 0;
Image img = Image.getInstance(srcBlob.getBytes(1, (int) srcBlob.length()));
float scaler =
document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin() - indentation;
img.scalePercent((scaler / img.getWidth()) * 100);
document.newPage();
document.add(Image.getInstance(img));
document.close();
//desBlob = new SerialBlob(pdfDocumentOutputStream.toByteArray());
conn = new OracleDriver().defaultConnection();
desBlob = BLOB.createTemporary(conn, false, BLOB.DURATION_SESSION);
desBlob.setBytes(1, pdfDocumentOutputStream.toByteArray());
pdfDocumentWriter.close();
pdfDocumentOutputStream.close();
}
} catch (Exception e) {
Show_Message(e);
}
return desBlob;
}
我已經(jīng)設(shè)置了一個(gè)賞金來(lái)獲得一個(gè)解決方案來(lái)解決這個(gè)問(wèn)題而不使用不推薦使用的類(lèi),但我找不到一個(gè),盡管我收到了對(duì)這個(gè)問(wèn)題的關(guān)注。在我找到正確的解決方案之前,這對(duì)我來(lái)說(shuō)是一個(gè)懸而未決的問(wèn)題。感謝所有努力的人。

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
我找到了這個(gè)沒(méi)有棄用代碼的解決方案:
public static Blob bytes2Blob(byte[] b) throws Exception {
if (System.getProperty("oracle.server.version") != null) {
Connection con = DriverManager.getConnection("jdbc:default:connection");
CallableStatement cStmt = con.prepareCall ("{ call DBMS_LOB.createtemporary(?,true,DBMS_LOB.SESSION) }");
cStmt.registerOutParameter(1, OracleTypes.BLOB);
cStmt.execute();
Blob blob = ((OracleCallableStatement)cStmt).getBLOB(1);
cStmt.close();
OutputStream out = blob.setBinaryStream(1L);
out.write(b);
out.flush();
return blob;
} else {
return new javax.sql.rowset.serial.SerialBlob(b);
}

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
您需要返回 Java 過(guò)程的實(shí)例oracle.sql.BLOB或oracle.jdbc2.Blob從 Java 過(guò)程返回實(shí)例,以創(chuàng)建調(diào)用 Java 過(guò)程并返回 BLOB 的觸發(fā)器。ORACLE 實(shí)際上有一個(gè)表,他們將數(shù)據(jù)類(lèi)型與他們可以接受的 Java 實(shí)例進(jìn)行比較:
合法的數(shù)據(jù)類(lèi)型映射。Oracle 數(shù)據(jù)庫(kù)自動(dòng)在 SQL 類(lèi)型和 Java 類(lèi)之間進(jìn)行轉(zhuǎn)換
更新 1:我實(shí)際上測(cè)試了傳遞 java.sql.Blob 并在函數(shù)中返回相同的類(lèi)型,它按預(yù)期工作:
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "Util" as
public class Util {
public static java.sql.Blob Convert_Image(java.sql.Blob srcBlob) {
return srcBlob;
}
}
/
CREATE OR REPLACE FUNCTION CONVERT_IMAGE(
P_BLOB BLOB)
RETURN BLOB
AS
LANGUAGE JAVA NAME 'Util.Convert_Image (java.sql.Blob) return java.sql.Blob';
select utl_raw.cast_to_varchar2(convert_image(utl_raw.cast_to_raw('test'))) from dual;
-- test
你可以嘗試運(yùn)行上面的代碼,看看你是否得到同樣的錯(cuò)誤?
添加回答
舉報(bào)