0

我有下表: 在此处输入图像描述

问题是当我尝试使用 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());

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

4

1 回答 1

6

看来您正在使用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);
   }
}

相关文件:

于 2011-03-28T05:10:43.210 回答