2015-08-18 59 views
1

我有需要放入Oracle數據庫(我使用11g)作爲存儲過程的函數。假設這個函數看起來像這樣:將字節數組作爲參數傳遞給存儲過程中的oracle

public static BLOB useByteArray(byte[] byteArray){ 
    //do something with this byte array, return BLOB with something 
} 

那麼包裝函數應該如何顯示呢?我知道這將是這個東西

CREATE OR REPLACE FUNCTION USE_BYTE_ARRAY(byteArray ???) RETURN BLOB IS 
LANGUAGE JAVA NAME 'com.example.something.useByteArray(byte[]???)'; 

但我不知道如何通過包裝和java函數之間的這個字節數組。也許,在Base64中編碼,作爲字符串傳遞,然後在useByteArray方法中編碼?

感謝提前:)

回答

1

我想你可以使用OracleTypes.BLOB從您的Java應用程序傳遞數據,你可以在你的存儲過程中blob數據類型使用它。

+0

我知道這個possilibity ,但我正在尋找發送原始字節。也許我會用BLOB,但現在我仍然在嘗試;) – rzysia

+0

你必須讓oracle瞭解你發送了什麼,我猜這就是blob的用法! – Swapnil

+0

這是很好的答案,謝謝:)但是,在我的具體情況base64會更有用 - 但'BLOB'是不錯的選擇;) – rzysia

0

對於這種需求,可以使用oracle的SYS REF CURSOR。我們可以將ARRAY的值發送到存儲過程。

1)SYS REF CURSOR聲明:

CREATE OR REPLACE PACKAGE TEST_CURSOR AS 

TYPE testCursorType是REF CURSOR; END;

2)接受ARRAY

CREATE OR REPLACE TYPE tabletype AS TABLE OF NUMBER(10); 

3創建ORACLE類型的表)創建過程

CREATE OR REPLACE PROCEDURE testProc 
(adeptno tabletype, 
testFetch IN OUT test_cursor.testCursorType) AS 
BEGIN 
OPEN testFetch FOR 
SELECT * 
FROM emp 
WHERE deptno IN (SELECT * 
FROM TABLE(CAST(adeptno AS tabletype))); 
END; 

4)最後JAVA代碼

private static final String ARRAY_PROCEDURE = "call testProc(?,?)"; 
int arrayElements[] = {10,20,30,40}; 
//Create an Array Descriptor 
ArrayDescriptor deptdesc = ArrayDescriptor.createDescriptor("TABLETYPE",connObj); 
//Define the Array (Descriptor,connection, Elements) 
ARRAY deptarray = new ARRAY(deptdesc, connObj, arrayElements); 
this.executePrepareQuery(conn, ARRAY_PROCEDURE,deptarray); 
+0

我在尋找答案如何匹配java中的byte []類型參數方法與包裝在oracle中調用它;) – rzysia

+0

是的我明白了,爲了達到這個目的,你應該在oracle中擁有JAVA類,以便你可以從Oracle存儲過程執行相同的類。看到這個鏈接http://docs.oracle.com/cd/B19306_01/java.102/b14187/chthree.htm – ChiranjeeviIT

相關問題