Ошибка вставки JdbcTemplate XmlType при больших размерах

2

Я не могу вставить довольно большой XML в столбец XMLType Oracle, используя драйвер JDBC и Spring JdbcTemplate.

Строка невелика, поэтому я создаю CLOB и XMLTYPE(?) ее в XMLTYPE(?) В команде insert:

String insertSql = "INSERT INTO tab (xmlcol) VALUES (XMLTYPE(?))";
int[] types = new int[] {Types.CLOB};
SqlLobValue xmlLob = new SqlLobValue(xmlString);
Object[] params = new Object[] {xmlLob};
int status = jdbcTemplate.update(insertSql, params, types);

Все в порядке, когда xmlString мала - например, 2 KB, но когда она больше (например, 450 KB) Исключение SQLException происходит с этим сообщением:

ORA-01461: can bind a LONG value only for insert into a LONG column

Как вставить большой XML-документ в столбец XMLType?

Подробности: я использую Database Oracle 12.1, Spring 4.3, ojdbc7 12.1

Теги:
spring
jdbctemplate
xmltype

1 ответ

1
Лучший ответ

Вы можете создать XMLType в Java-коде, а затем добавить параметры PreparedStatement,

Пример загрузки XML в столбец XMLTYPE в базе данных с помощью Spring JDBCTemplate:

//Next, we have to wrap the byte array in an InputStream to accepted
InputStream is = new ByteArrayInputStream(t.getObject().getBytes());

//Then, instantiate an XMLType object by using native OracleConnection and InputStream of the byte array object
final XMLType xmldoc = new XMLType(conn, is);
...
ps.setObject(3, xmldoc);

EDIT - детали решения:

Добавьте зависимости к pom.xml которые обеспечивают:

<dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>xdb6</artifactId>
    <version>12.1.0.2</version>
</dependency>
 <dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>xmlparserv2</artifactId>
    <version>12.1.0.2</version>
</dependency>

Извлеките и разверните обычный объект Connection для OracleConnection и используйте его для создания XMLType как описано в статье, приведенной выше. Также нет необходимости создавать подготовленный оператор, который может быть выполнен с помощью jdbcTemplate:

String xmlDocument = "<xml>...<very_large>...</xml>"
XMLType xmlType = new XMLType(conn, xmlDocument);
int status = jdbcTemplate.update(insertSql, xmlType);

Теперь он должен работать с XML-содержимым размером более 4 KB (1 MB) или даже больше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню