我对java中的Objet PreparedStatement 有点关注,要插入Oracle数据库。
感染我在 PreparedStatement 中准备好了我的INSERT查询模型。我为我要插入的每条记录添加addBatch()
所有参数。
我添加了几个批次来插入500条记录命中。例如。
在此之前所有这些都运作良好我可以插入我想要的内容
另一方面,如果我的 PreparedStatement 在我要插入的500行上生成 BatchUpdateException 错误(例如违反约束),则不会插入任何内容一点都不。
我想限制删除引起关注的记录(有违规约束)并插入至少499行即可
我该怎么做?如果她给我一个曲目,我将不胜感激。
Just for Info我想从500行插入几行笔画,因此逐行插入的解决方案不符合我太多的性能水平。
亲切
答案 0 :(得分:0)
也许这不是你想要的,但oracle有一些内置的错误逻辑
你必须创建一个错误表 例如如果该表名为emp,请运行此
exec dbms_errlog.create_error_log(dml_table_name=>'emp');
将创建一个表错误$ _emp,它将捕获错误
然后你可以在下面做这样的事情(注意日志错误到子句)
批处理将成功,您必须在运行后检查错误表中的错误
import java.sql.*;
public class Class1 {
public static void main(String[] args) throws SQLException {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PreparedStatement preparedStatement;
int records = 20;
try {
Connection connection = DriverManager.getConnection(
"jdbc:oracle:thin:@//host/db","scott","tiger");
String compiledQuery = "INSERT INTO EMP(EMPNO)" +
" VALUES" + "(?) LOG ERRORS INTO ERR$_EMP REJECT LIMIT UNLIMITED";
preparedStatement = connection.prepareStatement(compiledQuery);
for(int index = 1; index <= records; index++) {
preparedStatement.setInt(1, index);
preparedStatement.addBatch();
}
long start = System.currentTimeMillis();
int[] inserted;
try {
inserted = preparedStatement.executeBatch();
}
catch (SQLException e)
{
System.out.println("sql error");
}
long end = System.currentTimeMillis();
System.out.println("total time taken to insert the batch = " + (end - start) + " ms");
System.out.println("total time taken = " + (end - start)/records + " s");
preparedStatement.close();
connection.commit();
connection.close();
} catch (SQLException ex) {
System.err.println("SQLException information");
while (ex != null) {
System.err.println("Error msg: " + ex.getMessage());
ex = ex.getNextException();
}
throw new RuntimeException("Error");
}
}
}