【问题标题】:Passing byte array as parameter to stored procedure in oracle将字节数组作为参数传递给oracle中的存储过程
【发布时间】:2015-08-18 06:21:34
【问题描述】:

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

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方法编码?

提前致谢:)

【问题讨论】:

    标签: java oracle stored-procedures bytearray


    【解决方案1】:

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

    【讨论】:

    • 我知道这种可能性,但我正在寻找发送原始字节。可能我会使用 BLOB,但现在我仍在尝试 ;)
    • 您必须让 oracle 了解您发送的内容,我猜这就是 blob 可以用来做什么!
    • 这是一个很好的答案,谢谢 :) 但是,在我的具体情况下 base64 会更有用 - 但BLOB 是一个不错的选择;)
    【解决方案2】:

    对于这种需求,您可以使用 oracle 的 SYS REF CURSOR。我们可以将 ARRAY 值发送到存储过程。

    1) SYS REF CURSOR 声明:

    CREATE OR REPLACE PACKAGE TEST_CURSOR AS
    

    TYPE testCursorType 是 REF CURSOR; 结束;

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

    【讨论】:

    • 我正在寻找答案如何将 java 方法中的 byte[]type 参数与包装器匹配以在 oracle 中调用它;)
    • 是的,我明白了,要实现这一点,您应该在 oracle 中拥有 JAVA 类,这样您就可以从 Oracle 存储过程中执行相同的类。看到这个链接docs.oracle.com/cd/B19306_01/java.102/b14187/chthree.htm
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2016-02-02
    • 2023-03-22
    • 2013-09-13
    • 2010-11-07
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多