有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将空字符串更新为oracle Clob

我知道它是通过使用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没有被更新为空字符串,它仍然作为以前的值存储

有人能帮我吗


共 (1) 个答案

  1. # 1 楼答案

    正如我在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定位器时,才有必要锁定行(至少我对手册链接引用的理解是这样)