java - PreparedStatement如果Error则继续插入

标签 java oracle insert

我对 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/

相关文章:

java - 如何在android中获取recyclerView项目的X和Y坐标?

java - 未在 prepare 方法中设置的属性

java - sql 和使用 spring 注入(inject)属性哪个更好

haskell - 函数中的非穷尽模式-Haskell

从 iOS 代码接收数据的 PHP 文件不起作用

java - java中对象引用和克隆是如何工作的

java - 安卓应用架构

sql-server - 一个用户数据库服务于多个应用程序数据库

c# - 使用 ODP.NET,从 Oracle 数据库表的列信息创建 C# 类/结构

MySQL FK 语法 : insert column called practice into table cred_insurances that is FK to table practices