Я взаимодействую с базой данных Oracle через служебный класс Spring JdbcTemplate
, и я пробовал эти два варианта кода:
jdbcTemplate.update("INSERT INTO my_table (title, content) VALUES (?, ?)", title, content);
-- or --
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
OraclePreparedStatement ps = (OraclePreparedStatement)conn.prepareStatement("INSERT INTO my_table (title, content) VALUES (?, ?)");
ps.setString(1, title);
ps.setStringForClob(2, content);
return ps;
}
});
Где title
— это традиционный VARCHAR2
, а content
— это CLOB
.
Любой из этих вариантов работает для меньших значений content
. Однако, когда у меня есть большее количество content
, в столбец CLOB
ничего не вставляется.
Интересно, что в обоих случаях title
обновляется. Как будто запрос просто игнорирует content
, если их слишком много, но никогда не выдает ошибку.
Кто-нибудь знает, как я должен это решить?
Спасибо.
ИЗМЕНИТЬ:
Согласно ответу @GreyBeardedGeek, я пытался использовать OracleLobHandler
и DefaultLobHandler
с тем же эффектом. Все работает, пока мои CLOB
не достигнут определенного размера.
Я также попробовал следующий код, снова с тем же эффектом:
Connection conn = db.getDataSource().getConnection();
CLOB clob = CLOB.createTemporary(conn, false, CLOB.DURATION_SESSION);
clob.setString(1, myString);
OraclePreparedStatement ps = (OraclePreparedStatement)conn.prepareStatement("UPDATE my_table SET blob = ?");
ps.setCLOB(1, clob);
ps.execute();
Я сбит с толку тем, почему каждый из этих методов будет работать для меньших CLOB
, но затем внезапно перестанет работать для больших. Есть ли какая-то конфигурация в БД, которую мне не хватает? Или проблема в коде?