如何使用setCharacterStream在Oracle中更新Clob?

时间:2011-11-22 12:34:40

标签: java sql oracle jdbc oracle11g

当我使用以下代码片段更新Oracle Clob时:

     String toBeUpdated = ""
     StringReader reader = new StringReader(toBeUpdated);
     pStmt.setCharacterStream(parameterIndex,reader , toBeUpdated.length());

当字符串“toBeUpdated”的长度稍微大一些(一般超过5000)并且一个值已经准备好存储到db中时,它没有任何异常,并且当我在方法executeUpdate()中返回了期望值运行上面的代码。但陌生人的问题是我检查了数据库,发现该列为空。(应该用新值更新)。

每次都没有发生过,而是随机发生的。 我尝试使用pStmt.setString()而不是pStmt.setCharacterStream一切都会好起来的。据我所知,setString受限于最大字符串大小(63000),因此无法提出解决方案。

有人可以点亮我或体验过这个吗?

1 个答案:

答案 0 :(得分:1)

Oracle为字符串中的商店CLOB提供类。我使用以下代码,它工作正常:

    long id = ...
    String content = ... // CLOB content
    try {
        Class.forName ("oracle.jdbc.OracleDriver");
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@MY_SERVER:1521:MY_DB", "user", "pass");
        String query = "UPDATE MY_TABLE SET MY_CLOB_COLUMN = ? WHERE ID = ? ";
        OraclePreparedStatement opstmt = (OraclePreparedStatement)conn.prepareStatement(query);
        opstmt.setStringForClob(1, content);
        opstmt.setLong(2, id);
        int result = opstmt.executeUpdate();
         System.out.println("Resultado para : " + tabla + " - " + columna + "  - " +  id + ":" + result);
    } catch (SQLException ex) {
        //Log here
    } catch (ClassNotFoundException ex) {
        //Log here
    }