2015-08-18 60 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

相关问题