在将复杂对象类型从 Oracle 提取到 Java 时,我遇到了困难。
我正在使用 Spring JDBCTemplate 和 Spring StoredProcedure。
在 Oracle 端,我使用了一个函数,它返回一个 OBJECT(UNIT),它由一个 OBJECT(DIVISION) 的 TABLE(DIVISION_TAB) 组成,它本身由另一个 OBJECT(EMPLOYEE) 的一个 TABLE(EMPLOYEE_TAB) 组成。
这些类型定义如下:
create or replace TYPE UNIT AS OBJECT
(
UNIT_ID NUMBER(38),
UNIT_NAME VARCHAR(50),
DIVIVSION_LIST DIVIVSION_TAB
)
create or replace
TYPE DIVISION_TAB
AS TABLE OF DIVISION
create or replace
TYPE DIVISION AS OBJECT
(
DIV_ID NUMBER(38),
DIV_NAME VARCHAR(50),
DIV_STATUS NUMBER(38),
EMPLOYEE_LIST EMPLOYEE_TAB
)
create or replace
TYPE EMPLOYEE_TAB
AS TABLE OF EMPLOYEE
create or replace
TYPE EMPLOYEE AS OBJECT
(
EMP_ID NUMBER(38),
EMP_NAME VARCHAR(50),
EMP_STATUS NUMBER(38),
EMP_SAL NUMBER(20),
)
数据库级别的函数返回我一个 UNIT 的 SQL 对象,我在 Java 中检索它时以下列方式使用它。
declareParameter(new SqlOutParameter("UNIT", OracleTypes.STRUCT, "UNIT",new SqlReturnType() {
public Object getTypeValue(CallableStatement callableStatement, int colIndx, int sqlType, String typeName)
throws SQLException {
Connection connection = callableStatement.getConnection();
Map<String, Class<?>> typeMap = connection.getTypeMap();
typeMap.put("UNIT", Unit.class);
typeMap.put("DIVISION_TAB", java.sql.Array.class);
typeMap.put("DIVISION", Division.class);
typeMap.put("EMPLOYEE_TAB", java.sql.Array.class);
typeMap.put("EMPLOYEE", Employee.class);
STRUCT struct = (STRUCT)callableStatement.getObject(colIndx);
Object[] attr = struct.getAttributes();
return attr;
}
}));
问题::::
当我调试由 SqlReturnType() 方法返回的 Object[] 时,当我执行以下操作时,我能够获取 UNIT_ID 和 UNIT_NAME 等详细信息,但在第三个属性(即 oracle.sql.ARRAY 类型)上:
ARRAY array = (ARRAY)attr[3];
Object[] objects = (Object[])((ARRAY)attr[3]).getArray();
它抛出 SQL Internat 异常。