Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java字符串转换为CLOB_Java_Oracle_Jdbc_Clob - Fatal编程技术网

将Java字符串转换为CLOB

将Java字符串转换为CLOB,java,oracle,jdbc,clob,Java,Oracle,Jdbc,Clob,我有下表: 问题是,当我尝试使用JDBC向该字段插入字符串时,总是会出现以下错误: java.sql.SQLException: Data size bigger than max size for this type: 6019 我现在该怎么办 生成插入的java代码如下所示: Connection conn2 = null; if(connection==null||connection.isClosed()) { System.out.println("Connec

我有下表:

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

java.sql.SQLException: Data size bigger than max size for this type: 6019
我现在该怎么办

生成插入的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.
我不确定创建表是如何的,因为有人为我做了这件事

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

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);
   }
}
相关文件:


您似乎正在使用
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);
   }
}
相关文件:


能否显示insert语句,或者create table语句?还有您用来设置clob值的Java代码?上面我的问题已编辑。您能显示insert语句和create table语句吗?您用来设置clob值的Java代码?上面编辑了我的问题。当您有一个字符串时,您能使用setCharacterStream吗?我修改了上面的代码,我应该如何使用setCharacterStream?@EquinoX-如果你已经有
字符串中的内容,你可以将
字符串
包装成
CharArrayReader
ByteArrayInputStream
有时它会在线程“main”java.lang.NullPointerException:if(“body”)中给我错误异常.equalsIgnoreCase(fieldName)){pstmt.setCharacterStream(fieldName,new CharacterReader(value.ToCharray()),value.length());}检查值是否为空,并按照fitI实际检查值==空且从未命中的方式进行操作。。。奇怪的我不知道这个空值是从哪里来的。当你有一个字符串时,你能使用setCharacterStream吗?我修改了上面的代码,我应该如何使用setCharacterStream?@EquinoX-如果你已经有
字符串中的内容,你可以将
字符串
包装成
CharArrayReader
ByteArrayInputStream
有时它会在线程“main”java.lang.NullPointerException:if(“body”)中给我错误异常.equalsIgnoreCase(fieldName)){pstmt.setCharacterStream(fieldName,new CharacterReader(value.ToCharray()),value.length());}检查值是否为空,并按照fitI实际检查值==空且从未命中的方式进行操作。。。奇怪的我不知道这个空值是从哪里来的