Oracle JDBC:BatchUpdateException.getUpdateCounts不使用Oracle 12+驱动程序返回成功计数

我正在尝试编写逻辑以使用Oracle 12.1 jdbc驱动程序批量执行后检索失败的语句。我的数据库是Oracle 11.2。对于我的测试,我正在强制执行唯一约束冲突以触发BatchUpdateException。但是,即使实际失败应该发生在第三条记录上,batchUpdateException.getUpdateCounts也会为所有语句返回-3。我期望根据此处的Oracle文档,成功记录的范围为(-2,-2)或(1,1):https://docs.oracle.com/en/database/oracle/oracle-database/12.2/jjdbc/performance-extensions.html#GUID-BF1E09C3-44A7-4CE9-A28A-BB01D5E335A9

  

对于准备好的语句批处理,如果之间存在错误   执行批处理时,executeBatch方法无法返回值,   相反,它将引发BatchUpdateException。在这种情况下,例外   本身携带一个大小为n的int数组作为其数据,其中n是   成功记录执行的次数。例如,如果批次是   大小为5且错误发生在第4条记录,则   BatchUpdateException具有大小为3的数组(已执行3条记录   成功),数组中的每一项代表多少行   受他们每个人的影响。

我的代码在这里:

        String sqlQuery = "insert into testbulk(id,name,age) VALUES (?,?,?)";

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Properties info = new Properties( );
            info.put( "user",USER );
            info.put( "password",PASSWORD );
            info.put("defaultBatchValue",20);
            Connection conn = DriverManager.getconnection("jdbc:oracle:thin:@host:port:db",info);
            conn.setautoCommit(false);

            PreparedStatement ps = conn.prepareStatement(sqlQuery);

            ps.setInt(1,1);
            ps.setString(2,"Elana");
            ps.setInt(3,32);
            ps.addBatch();

            ps.setInt(1,"Jocelyne");
            ps.setInt(3,45);
            ps.addBatch();

            ps.setInt(1,"Bordie");
            ps.setInt(3,56);
            ps.addBatch();

            int[] affectedRecords = ps.executeBatch();
            conn.commit();
            ps.close();
        }
        catch(BatchUpdateException be) {
            int[] updateCount = be.getUpdateCounts();

            int count = 0;
            for (int i : updateCount) {
                if (i == Statement.EXECUTE_FAILED) {
                    System.out.println("Error on request " + count + ": Execute failed");
                } else {
                    System.out.println("Request " + count + ": OK");
                }
                count++;
            }
            be.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

我知道这不适用于版本11之前的任何ojbdc jar,这就是为什么我使用版本12 jar。但是仍然无法使其正常工作。

请参阅oracle doc:https://docs.oracle.com/database/121/JJDBC/oraperf.htm#JJDBC28767

  

在Oracle Database 11g第1版之前,返回的整数数组包含n个Statement.EXECUTE_FAILED条目,其中n是批处理的大小。但是,这并不表示错误在批处理中的何处发生。您唯一的选择是回滚事务。

     

从Oracle Database 11g第1版开始,返回的整数数组包含n个Statement.SUCCESS_NO_INFO条目,其中n是批中已成功执行的元素数。

如果我使用一个Statement而不是我需要的PreparedStatement,这对我有用。 有任何想法吗?预先感谢!

andys740813 回答:Oracle JDBC:BatchUpdateException.getUpdateCounts不使用Oracle 12+驱动程序返回成功计数

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3142918.html

大家都在问