У меня есть файл csv, загруженный пользователем, который мне нужно хранить как Clob, в таблице oracle.сохранение InputStream как clob в oracle с помощью jdbc
Поэтому у меня есть этот код:
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) ctx.getRequest();
final MultipartFile f = mr.getFile("datafile");
final InputStream is = f.getInputStream();
...
jdbc.getJdbcOperations().execute(sql, new PreparedStatementCallback<Integer>() {
public Integer doInPreparedStatement(final PreparedStatement psInsert) throws SQLException,
DataAccessException {
...
psInsert.setCharacterStream(1, new InputStreamReader(is));
psInsert.executeUpdate();
}
});
Кроме того, я попытался с помощью методов setClob и setAsciiStream из PreparedStatement, а также я попытался this подход (настройка размера файла), но результат тот же -
java.lang.AbstractMethodError
org.apache.commons.dbcp.DelegatingPreparedStatement.setAsciiStream(DelegatingPreparedStatement.java:338)
org.apache.commons.dbcp.DelegatingPreparedStatement.setAsciiStream(DelegatingPreparedStatement.java:338)
org.apache.commons.dbcp.DelegatingPreparedStatement.setAsciiStream(DelegatingPreparedStatement.java:338)
основная InputStream является ByteArrayInputStream (если это может сделать какой-либо разницы)
PS: табл е действительно имеет поле CLOB:
P_FILE CLOB NOT NULL,
UPD: Я на самом деле не пробовал Oracle реализованы методы. Он работает, единственная проблема заключается в том, что драйвер oracle реализует не все методы, сравнимые с теми, которые находятся в интерфейсе PreparedStatement. Класс смотреть на возможных доступных методов OraclePreparedStatement ...
вы пробовали setcharacterstream? http://stackoverflow.com/a/5067581/706695 – HRgiger
@HRgiger Да, я использую setCharacterStream - это то, что на самом деле в моем вопросе. Единственное отличие с ответом, с которым вы связались - я использую не StringReader, а InputStreamReader. Я мог бы читать все до строки, а затем создавать StreamReader (это на самом деле работает!) - но это просто беспорядочное решение. – javagirl
im not sure если я правильно понимаю, но clob для ввода текста. если вы хотите использовать байтовый ввод blob. в случае, если входной поток на самом деле текстовый, возможно, попробуйте его прочитать в строку и записать это в db. вы можете сделать setString работать с clob btw. –