JdbcTemplate вставка XmlType не удалась для больших размеров

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

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

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?

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


person jsosnowski    schedule 20.06.2018    source источник


Ответы (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);

ИЗМЕНИТЬ – сведения о решении:

Добавьте зависимости к 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 проверено) или даже больше.

person user7294900    schedule 20.06.2018