java - 将 Java 字符串转换为 CLOB

标签 java oracle jdbc clob

我有下表: enter image description here

问题是,当我尝试使用 JDBC 向该字段插入字符串时,我总是收到以下错误:

java.sql.SQLException: Data size bigger than max size for this type: 6019

我现在应该做什么?

生成 INSERT 的 java 代码如下:

Connection conn2 = null;
   if(connection==null||connection.isClosed())
   {
    System.out.println("Connection is null");
    conn2 = connectDB();
   }
   //REPLACE is non-standard SQL from MySQL, it's counter part of INSERT IGNORE
   String sql = ""; 
   sql = "INSERT INTO TEST."+tablename+" ("+fields+") VALUES ("+fields.replaceAll("[^,]+", "?")+")";

   System.out.println("SQL: "+sql);
   PreparedStatement pstmt =  conn2.prepareStatement(sql);

   // start parsing
   int event = r.getEventType();
   while (true) {
    // for each wanted element 
    if (event == XMLStreamConstants.START_ELEMENT
      && r.getName().toString().equalsIgnoreCase("row")) {
     System.out.println("Table : "+tablename+" / Row : "+rowCount );
     if (attributeCount == 0)
      attributeCount = r.getAttributeCount();


     //put each parameter to SQL
     int f=1;
     for (String field : fieldsArray){
    String value = r.getAttributeValue("",field);
    if("body".equalsIgnoreCase(field) && value != null) {
         pstmt.setCharacterStream(f++, new CharArrayReader(value.toCharArray()), value.length());
    } else {
         pstmt.setString(f++, value);
    }
 }

     pstmt.addBatch();
     rowCount++;

     if(rowCount%rowspercommit==0){
      System.out.println("Importing at row "+rowCount+" ... ");
      pstmt.executeBatch();
      conn2.commit();
     }
    } // end for each row.

不知道 CREATE TABLE 是如何的,因为有人为我这样做了

使用上面的当前代码,我现在得到:

Exception in thread "main" java.lang.NullPointerException
    at oracle.jdbc.dbaccess.DBData.clearItem(DBData.java:431)
    at oracle.jdbc.dbaccess.DBDataSetImpl.clearItem(DBDataSetImpl.java:3528)
    at oracle.jdbc.driver.OraclePreparedStatement.checkBindTypes(OraclePreparedStatement.java:3271)
    at oracle.jdbc.driver.OraclePreparedStatement.setStreamItem(OraclePreparedStatement.java:1178)
    at oracle.jdbc.driver.OraclePreparedStatement.setCharacterStream(OraclePreparedStatement.java:3539)
    at XMLDumpImporter.importXMLFile(XMLDumpImporter.java:179)
    at XMLDumpImporter.importXMLFolder(XMLDumpImporter.java:117)
    at XMLDumpImporter.main(XMLDumpImporter.java:48)

行:

if("body".equalsIgnoreCase(field) && value != null) {
             pstmt.setCharacterStream(f++, new CharArrayReader(value.toCharArray()), value.length());

这完全没有意义,因为什么可能为空

最佳答案

您似乎正在使用 setString 而不是 setCharacterStream 来设置 clob 的值。如果您使用 setString,那么驱动程序可能会将值转换为 varchar2,其大小限制为 4000 个字符。

黑客攻击:

int fieldIndex = 0;
for(String fieldName : fieldsArray) {
   String value = r.getAttributeValue("",field);
   if(value != null && "body".equalsIgnoreCase(fieldName)) {
     pstmt.setCharacterStream(++fieldIndex, new StringReader(value), value.length());
   } else {
     pstmt.setString(++fieldIndex, value);
   }
}

相关文档:

关于java - 将 Java 字符串转换为 CLOB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5454830/

相关文章:

database - 使用我的 ORACLE 数据库请求提交每 200 个客户端的最佳方法是什么

postgresql - PostgreSQL COPY 可以从远程位置读取 CSV 吗?

java - 为什么 Eclipse 必须经常清理/刷新?

java - 使用 JOOQ 从 Oracle 存储过程返回输出参数列表

Java:将元素从一个 ArrayList 传输到另一个 ArrayList

sql - 找不到元素时,如何打印列值的 'NULL' 或 '0' 值?

Java 到 DB 连接异常

java - JDBC中如何使用 "set @variable = 0"

java - Wicket RepeatingView 刷新/重新渲染?可能性? [列出缺少的项目]

java - 调整大小后未调用 LibGDX 渲染