如果错误

时间:2018-05-07 13:32:07

标签: java oracle insert

我对java中的Objet PreparedStatement 有点关注,要插入Oracle数据库。

感染我在 PreparedStatement 中准备好了我的INSERT查询模型。我为我要插入的每条记录添加addBatch()所有参数。

我添加了几个批次来插入500条记录命中。例如。

在此之前所有这些都运作良好我可以插入我想要的内容

另一方面,如果我的 PreparedStatement 在我要插入的500行上生成 BatchUpdateException 错误(例如违反约束),则不会插入任何内容一点都不。

我想限制删除引起关注的记录(有违规约束)并插入至少499行即可

我该怎么做?如果她给我一个曲目,我将不胜感激。

Just for Info我想从500行插入几行笔画,因此逐行插入的解决方案不符合我太多的性能水平。

亲切

1 个答案:

答案 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");
        }
    }
}