Oracle STRUCT использует OBJECT TYPE с атрибутом CLOB - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь использовать STRUCT для вставки массивных данных в мою таблицу DATA_TABLE, но выдает ошибку (java.sql.SQLException: не удается преобразовать во внутреннее представление) с полем типа данных CLOB, и я не могу найти решениек моей проблеме, мой код:

Моя таблица

CREATE TABLE DATA_TABLE (DAT_ID     NUMBER,
                         DAT_CODE   VARCHAR2(10),
                         DAT_TEXT   CLOB); 

Создать объект типа

CREATE OR REPLACE TYPE TY_OBJ_DATA AS OBJECT (DAT_ID    NUMBER,
                                              DAT_CODE  VARCHAR2(10),
                                              DAT_TEXT  CLOB); 

Создать таблицу типов из объекта типа

CREATE OR REPLACE TYPE TY_TABLE_DATA AS TABLE OF SCHEMA.TY_OBJ_DATA;

Мой упрощенный метод Java

public static void bulkData(List<DataTable> listDataInfo) throws Exception {
  DataSource ds = (DataSource) getEntityManager().getEntityManagerFactory().getProperties().get("javax.persistence.jtaDataSource");
  OracleConnection connection = ds.getConnection().unwrap(OracleConnection.class);
  try{       
      StructDescriptor typeTableObject = StructDescriptor.createDescriptor("SCHEMA.TY_OBJ_DATA", conect);
      STRUCT[] structData = new STRUCT[DataTable.size()];
      int counter= 0;
      for (DataTable d : listDataInfo) {
           Clob clob = connection.createClob();
           STRUCT m = new STRUCT(typeTableObject, connection,
                      new Object[]{d.getDatId(),
                                   d.getDatCode,
                                   clob.setString(1, d.getDatText)});
                structData [counter++] = m;
           }
           ArrayDescriptor tyTable = ArrayDescriptor.createDescriptor("SCHEMA.TY_TABLE_DATA", connection);
           ARRAY array = new ARRAY(tyTable, connection, structData);
           String sqlQuery = "{ CALL PACKAGE_BULK.PL_BULK_DATA }";
           CallableStatement cst = conect.prepareCall(sqlQuery);
           cst.setArray(1, array );
           cst.execute();
     } catch (Exception e) {
          throw new Exception(e);
     } finally {
       try {
            connection.close();
       } catch (SQLException e) {
           throw new Exception(e);
       }
     }
}

Я опускаю код пакета, потому что он работает правильно и не является моей основной проблемой. я использую ojdbc6 версии 11.2.0, java 8 и Oracle Database 12c Enterprise Edition, выпуск 12.2.0.1.0 - 64 бита.

Можно ли использовать STRUCT с полями типа CLOB? Я что-то не так делаю? мое поле DatText, когда оно переназначается, имеет тип String, и это было лучшее преобразование, которое мне удалось сделать из String в сгусток, но у меня все еще есть проблемы, есть идеи, как мне это решить? Спасибо.

...