将字节数组作为参数传递给oracle中的存储过程

时间:2015-08-18 06:21:35

标签: java oracle stored-procedures bytearray

我有功能,我需要将其放入Oracle数据库(我使用11g)作为存储过程。假设这个函数看起来像这样:

if let urlwithPercentEscapes = myUrlString.addingPercentEncoding(withAllowedCharacters: .urlAllowed) {
    print(urlwithPercentEscapes)  // "http://www.mapquestapi.com/geocoding/v1/batch?key=YOUR_KEY_HERE&callback=renderBatch&location=Pottsville,PA&location=Red%20Lion&location=19036&location=1090%20N%20Charlotte%20St,%20Lancaster,%20PA"
}

那么包装器功能应该如何?我知道这将是围绕这个

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

但我不知道如何在包装器和java函数之间传递这个字节数组。也许,在Base64中对其进行编码,以字符串形式传递,然后在CREATE OR REPLACE FUNCTION USE_BYTE_ARRAY(byteArray ???) RETURN BLOB IS LANGUAGE JAVA NAME 'com.example.something.useByteArray(byte[]???)'; 方法中进行编码?

提前致谢:)

2 个答案:

答案 0 :(得分:1)

我想你可以使用OracleTypes.BLOB从你的java应用程序传递数据,你可以在存储过程中使用blob数据类型来使用它。

答案 1 :(得分:0)

对于此类要求,您可以使用oracle中的SYS REF CURSOR。我们可以将值的ARRAY发送到存储过程。

1)SYS REF CURSOR声明:

CREATE OR REPLACE PACKAGE TEST_CURSOR AS

TYPE testCursorType是REF CURSOR; END;

2)创建ORACLE类型的表以接受ARRAY

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

3)创建程序

 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);