【发布时间】:2016-04-17 09:19:57
【问题描述】:
我在 oracle(12c) 中有一个存储过程:
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 的教程(如果链接丢失,请谷歌搜索“使用 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[] 的 Datum[] 数组,但是普通的 sql 方法什么也没给我。例如 getResultSet from array 返回一个 ResultSet , next 总是返回 true,但没有元数据和实际数据。 getArray() 返回 numElements = -1 等的数组。
我尝试玩 typeMap 但没有运气:
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);
请帮助和建议。提前致谢。
【问题讨论】:
标签: java oracle stored-procedures jdbc