Я пытаюсь использовать 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 в сгусток, но у меня все еще есть проблемы, есть идеи, как мне это решить? Спасибо.