我知道它可以通过使用SQL来工作
update activity set REFERENCE = EMPTY_CLOB() where id = ?
但是我不能这样,我不能在SQL中硬编码’EMPTY_CLOB()’。我使用了如下方式:
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并未更新为空字符串,但仍存储为先前值。
任何人都可以帮助我吗?
正如我在另一个问题中已经提到的:以我的经验,getClob()和setClob()无法正常工作。
使用setCharacterStream()来代替:
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
NULL
编辑:
对于较新的驱动程序(11.x),您可能还想尝试使用setString()和getString()在CLOB列上。
setString()
getString()
仅当在跨多个语句的事务中使用打算保留的LOB定位器时,才需要锁定行(至少这是我对手册的链接参考的理解)。