当前位置: 首页 > 面试题库 >

如何通过不具有ArrayIndexOutOfBoundsException的executeBatch获取生成的键?

慕乐池
2023-03-14
问题内容

下面的方法我想同时插入几条记录。

public void insert() {
    try {
        this.connection.setAutoCommit(false);
        PreparedStatement ps = this.connection.prepareStatement(
                "INSERT INTO  COMPANY (NAME,Address) Values (?,?)", new String[]{"ID"});
        ps.setString(1, "X01");
        ps.setString(2, "Address1");
        ps.addBatch();

        ps.setString(1, "Y01");
        ps.setString(2, "Address2");
        ps.addBatch();

       //EXCEPTION OCCURS HERE
        int[] numUpdates = ps.executeBatch();

        for (int i = 0; i < numUpdates.length; i++) {
                System.out.println("Execution " + i +
                        "successful: " + numUpdates[i] + " rows inserted");
        }

        ResultSet resultSet =
                (ps).getGeneratedKeys();
        while (resultSet.next()) {
            String deptNoKey = resultSet.getString(1);
            System.out.println("Automatically generated key value = "
                    + deptNoKey);
        }
    } catch (BatchUpdateException b) {
        // process BatchUpdateException
    } catch (SQLException e) {
        e.printStackTrace();
    }

}

在这一点上,当我希望获得为每个INSERT生成的PK时,就会收到此异常

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 22
  at

oracle.jdbc.driver.T4CNumberAccessor.unmarshalOneRow(T4CNumberAccessor.java:250)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:754)
at
oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
at
oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1250)
at
oracle.jdbc.driver.OraclePreparedStatement.executeForRowsWithTimeout(OraclePreparedStatement.java:14264)
at
oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:14379)
at
oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:589)
at dbpro.SqlHelper.insert2(SqlHelper.java:988)
at dbpro.SqlHelper.main(SqlHelper.java:1023)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at
com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)


例外之后:在表COMPANY中,正确添加了两条记录,但是我希望对每个执行的插入操作都获得一个ResultSet一行,因此我可以生成每个PK。


问题答案:

这似乎是Windows上Oracle中的错误,或者是驱动程序JAR ojdbc6.jar或(都知道Oracle)中的错误。

您提供的代码没有什么大问题。它应该可以工作,尽管当我运行它时,每次插入的行数都返回为-2(=
Statement.SUCCESS_NO_INFO),因此最好忽略这些数字。

对于具有四个版本的Oracle JDBC驱动程序JAR的Linux上的Oracle 11g XE
11.2.0.2.0,您的代码对我来说运行良好。但是,如果我在具有相同版本的Oracle XE和ojdbc6.jar的Windows
10上运行它,它将因您获得的相同ArrayIndexOutOfBoundsException而失败。如果我使用ojdbc7.jar而不是ojdbc6.jar,问题就解决了。

因此,我建议将ojdbc6.jar替换为ojdbc7.jar,您可以从此处下载。



 类似资料:
  • 问题内容: 我经常去一个网站查找东西。我对自己心想:“继续。我可以编程。当我可以编写一个可以为我做的软件时,为什么要手动进入该站点?”。 所以我开始了。我正在使用C#,所以我找到了WebClient和Uri。 我已经设法获取了该站点的源代码,但是问题出在加载源代码之后,我要查找的特定数据是通过AJAX生成的。 那就是我的问题。如果需要先通过AJAX调用来请求,该如何获取该代码? 问题答案: 通用方

  • 我正在使用CXF Web客户端调用Soap Web服务。 WSDL2JAVA用于从wsdl生成Java代码。有来自soap头的信息,但生成的代码没有访问该头的方法。 如何通过CXF Web客户端获取标题信息?

  • 我正在使用@FindBy注释来定位WebElements。但是我想在方法中使用这些WebElement作为参数。只有在页面上找到WebElement,我才能成功地使用它。但如果我想等待它,我必须使用By(使用相同的定位器)。 例如。 这样,我就可以在某些方法中使用这个WebElement作为By对象,比如 对于每个元素,我有4行代码。我很懒,正在寻找一种简化的方法。

  • 本文向大家介绍如何获取自动生成的(主)键值?相关面试题,主要包含被问及如何获取自动生成的(主)键值?时的应答技巧和注意事项,需要的朋友参考一下 insert 方法总是返回一个 int 值 ,这个值代表的是插入的行数。 如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入 的参数对象中。 示例:

  • 问题内容: 我正在编写几个Java程序,在完成我想做的所有事情之后,需要在单独的JVM中终止/清理工作。为此,我将需要获取要创建的Java进程的PID。 问题答案: 在Windows和Unix上均可使用。您可以使用从Java程序中调用此命令。的样本输出如下 您可能需要对此进行解析,然后检查标准名称,然后从相应的行中获取pid。

  • 问题内容: 我的代码如下: rs 总是返回时不是null ,有人对此有想法吗?谢谢。 问题答案: 元数据接口实现由驱动程序供应商实现。某些驱动程序和某些数据库可能不支持它。这是来自Javadoc的文本:一些DatabaseMetaData方法以ResultSet对象的形式返回信息列表。常规的ResultSet方法(例如getString和getInt)可用于从这些ResultSet对象检索数据。如