Как обновить пустую строку в оракула Clob - PullRequest
0 голосов
/ 17 ноября 2011

Я знаю, что это работает с использованием SQL

update activity set REFERENCE = EMPTY_CLOB() where id = ?

Но я не могу так поступить, я не могу жестко закодировать 'EMPTY_CLOB ()' в SQL.Я использовал следующий способ:

String empty_string = "";
conn = getConnection();

pStmt = conn.prepareStatement("SELECT REFERENCE FROM activity WHERE ID = ? FOR UPDATE");
pStmt.setLong(1, 1);
rset = pStmt.executeQuery();
Clob clob = null;
while (rset.next()) {
    clob = rset.getClob(1);
    Writer writer = adapter.getCharacterOutputStream(clob);
    writer.write(empty_string);         
    writer.flush();
    writer.close();
}

pStmt = conn.prepareStatement("update activity set REFERENCE = ? WHERE ID = ?");
pStmt.setClob(1, clob);
pStmt.setLong(2, 1);
pStmt.executeUpdate();

Но это не сработало.clob не был обновлен до пустой строки, он все еще сохранен как предыдущее значение.

Любое тело может помочь мне в этом?

1 Ответ

3 голосов
/ 17 ноября 2011

Как я уже упоминал в ваш другой вопрос : по моему опыту getClob () и setClob () не работают должным образом.

Используйте setCharacterStream() вместо:

StringReader clob = new StringReader("");
pStmt = conn.prepareStatement("update activity set REFERENCE = ? WHERE ID = ?");
pStmt.setCharacterStream(1, clob, 0);
pStmt.setLong(2, 1);
pStmt.executeUpdate();

Таким образом, вы также можете удалить ненужный SELECT перед обновлением, что также улучшит производительность.

Другой вариант - установить для этого столбца значение NULL

.

Edit:

С более новыми драйверами (11.x) вы также можете попробовать использовать setString() и getString() в столбце CLOB.

Блокировка строки должна быть необходима, только если вы используете локатор больших объектов, который намереваетесь сохранить во время транзакции, охватывающей более одного оператора (по крайней мере, это мое понимание связанной ссылки на руководство).

...