2013-10-29 34 views
1

我有一個InputStream,我知道這是一個需要用來更新Oracle中的Blob的PDF。如何將此流轉換爲BufferedOutputStream,或者使用此流信息更新Blob?將InputStream放入BufferedOutputStream以上載到Blob中

請注意,我是而不是由於代碼的限制,允許在我的代碼中包裝Oracle類。

我試過到目前爲止:

我已經嘗試使用這樣的回答:https://stackoverflow.com/a/1574857/2188082連接流,但結果是NullPointerError,因爲OutputStream的是空的。

我想當前查詢運行:

pstmt = dbConn.prepareStatement("UPDATE "+ qualTable("document")+" set document_blob =" 
        +" utl_raw.cast_to_raw('"+inStream+"') where document_id = " + documentId); 

     pstmt.execute(); 
     pstmt.close(); 

我知道utl_raw.cast_to_raw可能不是正確的Oracle方法來調用一個inStream中讀取的,可惜我不是很精通甲骨文,因爲我想成爲,所以我不知道我應該使用正確的演員陣容。

+0

您已經評論過我的代碼,將數據從一個數據流複製到另一個數據流 - 請包括您在問題中已經嘗試過的內容。 –

回答

3

PreparedStatement.setBlob(parameterIndex, inputStream, length).

一樣了setString等setter方法。沒有OutputStream,但需要一個長度。

+0

parameterIndex是數據庫中的位置嗎?另外,我是否需要執行此聲明,還是按原樣工作? – Zibbobz

+0

沒關係,我被Rolfl提醒說我需要包含一個?在我的PreparedStatement中使其成爲參數。謝謝。 :) – Zibbobz

1

做到這一點的典型方法是創建一個byte[]陣列,並用它來傳送數據:

byte[] buffer = new byte[4096]; // 4K buffer... 
int len = 0; 
while ((len = input.read(buffer)) >= 0) { 
    output.write(buffer, 0, len); 
} 
output.flush(); 

這將複製一些數目在從輸入到輸出的每個循環的字節,直到用完輸入。

緩衝區的大小是一個可調參數,應該在您的環境中測試以查看最佳效果。

+0

不幸的是,這給我返回一個空錯誤,因爲輸出流是空的。 – Zibbobz

+1

我看到你的問題暗示了這一點。有兩件事情:正如Joop所建議的那樣,使用位置準備語句(創建預準備語句時參見'?'參數),並找出輸出流爲空/關閉的原因,不應該這樣做。 – rolfl

+0

您的提醒包括?參數保存了一天。謝謝你們倆。 :) – Zibbobz

相關問題