我对 Java 中的 Objet PreparedStatement 插入 Oracle 数据库有点担心。
感染我在 PreparedStatement 中准备好了 INSERT 查询的模型,我为要插入的每条记录添加了使用 addBatch()
的所有参数。
例如,我添加了多个批处理以插入 500 条记录命中。
在此之前,所有这些都可以正常工作,我可以插入我想要的内容
另一方面,如果我的 PreparedStatement 在我想要插入的第 500 行上生成 BatchUpdateException 错误(例如违反约束),那么它根本不会插入任何内容。
我想限制删除引起关注的记录(带有违规约束)并插入至少 499 行没问题
我怎样才能做到这一点?如果她能给我一首轨道,我将不胜感激。
仅供引用,我想从 500 行中插入几行笔画,因此逐行插入的解决方案不太适合我的性能水平。
诚挚的
最佳答案
也许这不是你想要的,但 Oracle 有一些内置的错误逻辑
你必须创建一个错误表 例如如果该表名为 emp,则运行此
exec dbms_errlog.create_error_log(dml_table_name=>'emp');
这将创建一个表 err$_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");
}
}
}
关于java - PreparedStatement如果Error则继续插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50215523/