1

在将复杂对象类型从 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 异常。

4

1 回答 1

0

此问题已解决。只是一个简单的错误。代码完全正确,我只是错过了授予我定义的类型的权限。

于 2012-10-15T12:18:38.230 回答