Я не могу вставить довольно большой 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
Вы можете создать 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
) или даже больше.