如何使用Java从oracle函数返回嵌套表?

时间:2010-05-24 16:16:30

标签: java oracle jdbc

我有以下类型声明和Oracle函数:

CREATE OR REPLACE TYPE var_outcomes_results IS TABLE OF VARCHAR2(80);

CREATE OR REPLACE FUNCTION getValuesAbove(in_nodeID IN table1.KEY_SL%TYPE,
                                          in_variable IN VARCHAR2)
    RETURN var_outcomes_results
IS
    currentID table1.KEY_SL%TYPE;
    results var_outcomes_results;
    currentIndex integer := 0;
BEGIN
    currentID := in_nodeID;

    WHILE currentID != null
    LOOP
        FOR outcomeRecord IN
            (select distinct a.PARENT, b.NAME, c.OUTCOME
             from table1 a
             left outer join table2 b on a.KEY_SL = b.KEY_SL
             left outer join table3 c on b.VAR_ID = c.VAR_ID
             where a.KEY_SL = currentID)
        LOOP
            currentID := outcomeRecord.PARENT;

            IF lower(outcomeRecord.NAME) = lower(in_variable) AND
               outcomeRecord.OUTCOME != null THEN
                currentIndex := currentIndex + 1; 
                results(currentIndex) := outcomeRecord.OUTCOME;
            END IF;
        END LOOP;
    END LOOP;

    RETURN results;
END;

我有以下Java函数:

public List<Object> getAboveValues(String variable, Integer nodeID)
{
    Connection connection = null;
    CallableStatement callableStatement = null;

    try
    {
        connection = dataSource.getConnection();
        callableStatement = connection.prepareCall("begin ? := getValuesAbove(?,?); end;");

        callableStatement.registerOutParameter(1, OracleTypes.ARRAY);
        callableStatement.setInt(2, nodeID);
        callableStatement.setString(3, variable);
        callableStatement.execute();

        System.out.println(callableStatement.getObject(1));
    }
    catch( SQLException e )
    {
        logger.error("An Exception was thrown in getAboveValues: " + e);
    }
    finally
    {
        closeDataResources(callableStatement, connection);
    }
}

但是,当我执行该函数时,我收到以下错误消息:“ORA-03115:不支持的网络数据类型或表示”

我做错了什么?

任何想法/建议都将不胜感激。

谢谢, B.J。

3 个答案:

答案 0 :(得分:3)

我现在无法检查,但我认为您可以使用

的prepareStatement和resultSet来执行此操作
... = connection.prepareStatement("select * from table(getValuesAbove(?,?))");

这应该与瘦驱动程序一起工作,据我所知 - 所有的辛苦工作都在数据库上完成,所以它看起来像JDBC中的任何其他select

答案 1 :(得分:1)

如果您想返回TABLE OF VARCHAR2,则应使用特定于Oracle的代码:OracleCallableStatement.registerIndexTableOutParameter而不是CallableStatement.registerOutParameter

由于这需要OCI驱动程序而不是Thin驱动程序,我无法测试此代码。

答案 2 :(得分:0)

试试这个。
PL / SQL中有3种集合类型:关联数组,嵌套表和varray 您可以将嵌套表中的数据传输到varray数据类型 然后,您可以按照以下链接中的步骤操作:
Fetch pl/sql array return values in java

如果您找到了直接解决方案,请评论我,我也可以使用它。 :)