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

问题描述:

我有以下类型声明和Oracle功能:如何使用Java从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.

+0

我不认为一个varchars表是相当于OracleTypes.ARRAY。我已经看到人们使用REF CURSOR来执行此操作,然后该REF CURSOR映射到OracleTypes.CURSOR – CarlG 2010-05-24 16:58:29

我现在不能检查这个权利,但我认为你可以用一个PreparedStatement和ResultSet使用

... = connection.prepareStatement("select * from table(getValuesAbove(?,?))"); 

这应该与薄驱动程序,只要我能记得做到这一点 - 所有数据库正在努力完成,因此它看起来像来自JDBC的其他select

+0

谢谢,这很好。 – Benny 2010-05-24 18:32:30

如果你想返回TABLE OF VARCHAR2你应该使用Oracle特定代码:OracleCallableStatement.registerIndexTableOutParameter代替CallableStatement.registerOutParameter

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

试试这个。
PL/SQL中有3种集合类型:关联数组,嵌套表和varray。
您可以将嵌套表中的数据转换为varray数据类型。
然后,您可以按照程序在此链接:
Fetch pl/sql array return values in java

评论我,如果你发现了一个直接的解决方案,所以我也可以使用它。 :)