[英]Convert Java String to CLOB
I have the following table: 我有下表:
The problem is that when I try to use JDBC to insert a String to this field I always get the following error: 问题是,当我尝试使用JDBC在此字段中插入字符串时,总是会收到以下错误:
java.sql.SQLException: Data size bigger than max size for this type: 6019
what should I do now? 我现在应该怎么办?
The java code to generate the INSERT is the following: 生成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.
Not sure how the CREATE TABLE is, as someone did that for me 不确定CREATE TABLE的状态,因为有人为我做了
With the current code above, I am now getting this: 使用上面的当前代码,我现在得到这个:
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)
at line: 在行:
if("body".equalsIgnoreCase(field) && value != null) {
pstmt.setCharacterStream(f++, new CharArrayReader(value.toCharArray()), value.length());
Which made no total sense as what could possibly be null 这完全没有意义,因为可能为空
It seems that you are using setString
instead of setCharacterStream
to set value of the clob. 似乎您正在使用setString
而不是setCharacterStream
来设置clob的值。 If you are using setString
then the driver probably converts the value to varchar2
which has size limit of 4000 characters. 如果使用的是setString
则驱动程序可能会将值转换为大小限制为4000个字符的varchar2
。
Hackety hack: 骇客骇客:
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);
}
}
Relevant documentation: 相关文件:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.