如何使用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.
我现在不能检查这个权利,但我认为你可以用一个PreparedStatement和ResultSet使用
... = connection.prepareStatement("select * from table(getValuesAbove(?,?))");
这应该与薄驱动程序,只要我能记得做到这一点 - 所有数据库正在努力完成,因此它看起来像来自JDBC的其他select
。
谢谢,这很好。 – 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
评论我,如果你发现了一个直接的解决方案,所以我也可以使用它。 :)
我不认为一个varchars表是相当于OracleTypes.ARRAY。我已经看到人们使用REF CURSOR来执行此操作,然后该REF CURSOR映射到OracleTypes.CURSOR – CarlG 2010-05-24 16:58:29