簡體   English   中英

在java存儲過程中創建java.sql.blob實例

[英]Create java.sql.blob instance in java stored procedure

這是我第一次在stackoverflow中發布一個問題,我需要編寫一個java存儲過程來創建一個excel文件並返回一個包含文件數據的blob(以字節為單位)。

我的pl / sql函數采用以下形式

function test_create_excel(i_username IN varchar2) return BLOB
   AS LANGUAGE JAVA NAME 'NTO.Excel.ExcelFunctions.PushToExcel( java.lang.String ) return java.sql.Blob';

我的Java方法如下

public static java.sql.Blob TestPushToExcel(String username) throws IOException, SQLException{
        //create excel file, read content to byte array and set to a blob
    }

我的問題是我找不到任何方法來創建java.sql.Blob的實例,以便我可以使用blob.setBinaryStream(..)方法來編寫文件數據字節數組。

我嘗試使用SerialBlob實現,但它導致以下oracle錯誤

ORA-00932:不一致的數據類型:預期返回值是用戶定義的Java類的實例,可轉換為Oracle類型,獲得無法轉換的對象

有沒有人遇到過這個問題,如果有的話你可以分享一下你是如何度過這個問題的。

先感謝您。

編輯JAVA

public static oracle.sql.BLOB getBlob(byte[] data) throws SQLException, IOException{
        oracle.jdbc.OracleConnection conn = (oracle.jdbc.OracleConnection)new OracleDriver().defaultConnection();

        oracle.sql.BLOB retBlob = oracle.sql.BLOB.createTemporary(conn, true, oracle.sql.BLOB.DURATION_SESSION);

        java.io.OutputStream outStr = retBlob.setBinaryStream(0);
        outStr.write(data);
        outStr.flush();

        return retBlob;
  }


public static ExcelFileStore PushToExcel(String userId) throws IOException, SQLException{

        ExcelFileStore fileStore = new ExcelFileStore();        
        fileStore.NU_USERID = userId;
        fileStore.CreatedTime = new java.sql.Date(new Date().getTime());
        fileStore.Last_Updated = new java.sql.Date(new Date().getTime());        
        fileStore.FileSize = fileData.length;
        fileStore.FileData = getBlob(fileData);        
        return fileStore;
    }

PL / SQL

 function test_create_excel(i_username IN varchar2) return EXCELFILESTORE    AS LANGUAGE JAVA NAME 'NTO.Excel.ExcelFunctions.PushToExcel( java.lang.String, ) return OracleObjects.ExcelFileStore';

OracleObject.ExcelfileStore是一個實現java.sql.SqlData的類,而EXCELFILESTORE是oracle中的UDT。

我使用' sys.dbms_java.loadjava '加載了為我的代碼創建的引用jar和jar

我希望你理解我的問題,因為我對pl / sql編程很新

我錯了。 可以做到。 花了一些時間讓它工作,但是,最后,這是一個有效的例子:

Java類

import oracle.jdbc.driver.*;

public class TestBlob {
  public static oracle.sql.BLOB getBlob(String username) throws Exception {
    oracle.jdbc.OracleConnection conn = 
      (oracle.jdbc.OracleConnection)new OracleDriver().defaultConnection();

    oracle.sql.BLOB retBlob =
      oracle.sql.BLOB.createTemporary(conn,
                                      true,
                                      oracle.sql.BLOB.DURATION_SESSION);

    java.io.OutputStream outStr = retBlob.setBinaryStream(0);
    outStr.write(username.getBytes());
    outStr.flush();

    return retBlob;
  }
}

如您所見,我已將oracle.sql.BLOB用於結果。 我使用BLOB類的靜態createTemporary方法創建它,指定它應該在會話期間創建( oracle.sql.BLOB.DURATION_SESSION參數)。

然后,我獲取OutputStream並寫入數據。 需要沖洗。

數據庫方面

create or replace FUNCTION getBlobWrp (username IN VARCHAR2) RETURN BLOB
  AS LANGUAGE JAVA NAME
              'TestBlob.getBlob(java.lang.String) return oracle.sql.BLOB';

測試:

DECLARE
  l_blob BLOB;
BEGIN
  l_blob := getBlobWrp('test');

  dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(l_blob));
END;

輸出:

test

(上一個答案)

我認為你的test_create_excel函數中應該有一個IN OUT BLOB參數(將其更改為一個過程),並在Java存儲方法中對該參數進行操作。 我曾經看過那種方法。

在調用test_create_excel之前,您應該創建一個BLOB對象:

DECLARE
  l_blob BLOB;
BEGIN
  DBMS_LOB.createtemporary(l_blob, TRUE);
  test_create_excel('username', l_blob);
END;

編輯

我不認為你想做的事情是可能的。 但是,您可以將上面的代碼包裝在另一個函數中。 它有點亂,但是你會有一個返回blob的函數:

CREATE OR REPLACE FUNCTION get_excel_blob(p_username VARCHAR2) RETURN BLOB
AS
  l_blob BLOB;
BEGIN
  DBMS_LOB.createtemporary(l_blob, TRUE);
  test_create_excel(p_username, l_blob);
  RETURN l_blob;
END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM