2010-05-24 70 views
2

我有以下類型聲明和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

回答

3

我現在不能檢查這個權利,但我認爲你可以用一個PreparedStatement和ResultSet使用

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

這應該與薄驅動程序,只要我能記得做到這一點 - 所有數據庫正在努力完成,因此它看起來像來自JDBC的其他select

+0

謝謝,這很好。 – Benny 2010-05-24 18:32:30

1

如果你想返回TABLE OF VARCHAR2你應該使用Oracle特定代碼:OracleCallableStatement.registerIndexTableOutParameter代替CallableStatement.registerOutParameter

由於這需要OCI驅動程序而不是Thin驅動程序,因此我無法測試此代碼。

0

試試這個。
PL/SQL中有3種集合類型:關聯數組,嵌套表和varray。
您可以將嵌套表中的數據轉換爲varray數據類型。
然後,您可以按照程序在此鏈接:
Fetch pl/sql array return values in java

評論我,如果你發現了一個直接的解決方案,所以我也可以使用它。 :)