2011-11-17 85 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:我從來沒有見過它。所以你對「*所有人*」的看法似乎與我對所有人的看法不同* –