2011-11-22 79 views
0

当我使用的后续片段来更新甲骨文的Clob:如何使用setCharacterStream更新Oracle中的Clob?

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

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

它没有发生每次,但有一点点随机。 我试过用pStmt.setString()代替pStmt.setCharacterStream,一切都会好的。据我所知setString是有限的最大化字符串大小(63000)它不能被提议的解决方案。

有人能照亮我或经历过吗?

回答

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 
    }