2011-11-17 39 views
0

我知道它的工作原理是使用SQL如何将空字符串更新为oracle Clob

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没有更新为空字符串,它仍然存储为以前的值。

任何身体都可以帮助我吗?

回答

3

正如我在your other question中已经提到的:在我的经验中,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

编辑:

有了更新的驱动程序(11.x的),你可能也想尝试在CLOB列使用setString()getString()

只有当您使用您希望在跨越多个语句的事务(至少这是我对链接的手册参考的理解)期间保留的LOB定位器时,才需要锁定该行。

+0

+1建议将列设置为NULL。 –

+0

感谢您的建议,我认为您的方式有效。但。只是有点混乱,因为你的方式简单而且表现很好,为什么所有的人总是在做并且仍然在做。先选择然后更新。形式oracle官方文档还是建议先选择然后更新。令人困惑...... –

+0

@ user872501:我从来没有见过它。所以你对“*所有人*”的看法似乎与我对所有人的看法不同* –