ahe*_*ang 0 java oracle jdbc clob
我有下表:

问题是,当我尝试使用JDBC在此字段中插入字符串时,总是会收到以下错误:
java.sql.SQLException: Data size bigger than max size for this type: 6019
Run Code Online (Sandbox Code Playgroud)
我现在应该怎么做?
生成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.
Run Code Online (Sandbox Code Playgroud)
不确定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)
Run Code Online (Sandbox Code Playgroud)
在行:
if("body".equalsIgnoreCase(field) && value != null) {
pstmt.setCharacterStream(f++, new CharArrayReader(value.toCharArray()), value.length());
Run Code Online (Sandbox Code Playgroud)
这完全没有意义,因为可能为空
似乎您在使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
相关文件:
| 归档时间: |
|
| 查看次数: |
13093 次 |
| 最近记录: |