1

Oracle から Java に複合オブジェクト タイプをフェッチする際に問題が発生しています。

Spring JDBCTemplate と Spring StoredProcedure を使用しています。

Oracle側で、別のOBJECT(EMPLOYEE)のTABLE(EMPLOYEE_TAB)で構成されるOBJECT(DIVISION)のTABLE(DIVISION_TAB)で構成されるOBJECT(UNIT)を返す関数を使用しました。

これらのタイプは次のように定義されています。

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 の 3 番目の属性について取得できます。

        ARRAY array = (ARRAY)attr[3];
    Object[] objects =  (Object[])((ARRAY)attr[3]).getArray();

SQL Internat Exception をスローします。

4

1 に答える 1

0

この問題は解決されました。単純な間違いです。コードは完全に正しいです。定義した TYPES に許可を与えるのを逃しました。

于 2012-10-15T12:18:38.230 に答える