我在Oracle有一个存储过程(12C):JDBC:Oracle存储过程返回嵌套表
PROCEDURE work(a OUT VARCHAR2, b OUT SYS_REFCURSOR)
当我调用光标的结果包含的行的程序,所述行包括一些原始值的+一自定义类型:
CREATE TYPE ELEM AS OBJECT(ElemID INTEGER))
CREATE TYPE LIST AS TABLE OF ELEM
所以,结果是一样的东西:
vcursor:
------------------
COL1 COL2 LIST
------------------
A B LIST([ELEM],[ELEM])
C D LIST([ELEM],[ELEM],[ELEM])
E F LIST([ELEM])
有一个教程收集Oracle tutorial(如果链接丢失,google为“使用Oracle集合”)。到目前为止,本教程还没有为我工作。
以下是我在java做:
Connection conn = ...
CallableStatement statement = conn.prepareCall("{call work()}");
statement.registerOutParameter(1, OracleTypes.VARCHAR);
statement.registerOutParameter(2, OracleTypes.CURSOR);
statement.execute();
ResultSet rs = statement.getResultSet(2);
// here should be the code which retrieves the nested table elements
rs.next()
Array list = rs.getArray(3); //oracle.sql.ARRAY
Object[] elems = (Object[]) list.getArray(); // doesn't work
// I also tried list.getResultSet()
在调试我也看到,如果我投来oracle.sql.ARRAY并调用getOracleArray(),然后我看到了正确的大小和基准[]数组与Struct [],然而普通的sql方法没有给我什么。例如,数组中的getResultSet返回一个ResultSet,其中下一个总是返回true,但不包含元数据和实际数据。的getArray()返回数组包含numElements = -1等。
我试着用类型映射玩,没有运气:
Map map = conn.getTypeMap();
map.put("ELEM", Elem.class);
//map.put("SCHEMA.ELEM", Elem.class);
//map.put("LIST", Elem.class);
//map.put("SCHEMA.LIST", Elem.class);
conn.setTypeMap(map);
请帮助和建议。提前致谢。
我用ojdbc6- 6.0。我很惊讶,它为你工作..不幸的是,它决定将嵌套表更改为包含对象的xml字符串,所以我们可以将它解析回单独的元素。如果我再次遇到同样的问题,我接受答案并尝试验证代码。非常感谢! –