JDBC批处理INSERT,返回ID

如何解决JDBC批处理INSERT,返回ID?

开发过程中遇到JDBC批处理INSERT,返回ID的问题如何解决?下面主要结合日常开发的经验,给出你关于JDBC批处理INSERT,返回ID的解决方法建议,希望对你解决JDBC批处理INSERT,返回ID有所启发或帮助;

问题描述

我假设这是关于Oracle的。据我所知,这是不可能的,但是您可以FORALL在匿名PL /SQL块中使用进行批量插入,如我最近写的这篇文章中所述:https://codingdict.com/blog/1619

这是本文中的一个自包含的JDBC示例,该示例插入值数组,然后将结果批量收集回JDBC客户端:

try (Connection con = DriverManager.getConnection(url, props);
    Statement s = con.createStatement();

    // The statement itself is much more simple as we can
    // use OUT parameters to collect results into, so no
    // auxiliary local variables and cursors are needed
    CallableStatement c = con.prepareCall(
        "DECLARE "
      + "  v_j t_j := ?; "
      + "BEGIN "
      + "  FORALL j IN 1 .. v_j.COUNT "
      + "    INSERT INTO x (j) VALUES (v_j(j)) "
      + "    RETURNING i, j, k "
      + "    BULK COLLECT INTO ?, ?, ?; "
      + "END;")) {

    try {

        // Create the table and the auxiliary types
        s.execute(
            "CREATE TABLE x ("
          + "  i INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,"
          + "  j VARCHAR2(50),"
          + "  k DATE DEFAULT SYSDATE"
          + ")");
        s.execute("CREATE TYPE t_i AS TABLE OF NUMBER(38)");
        s.execute("CREATE TYPE t_j AS TABLE OF VARCHAR2(50)");
        s.execute("CREATE TYPE t_k AS TABLE OF DATE");

        // Bind input and output arrays
        c.setArray(1, ((OracleConnection) con).createARRAY(
            "T_J", new String[] { "a", "b", "c" })
        );
        c.registerOutParameter(2, Types.ARRAY, "T_I");
        c.registerOutParameter(3, Types.ARRAY, "T_J");
        c.registerOutParameter(4, Types.ARRAY, "T_K");

        // Execute, fetch, and display output arrays
        c.execute();
        Object[] i = (Object[]) c.getArray(2).getArray();
        Object[] j = (Object[]) c.getArray(3).getArray();
        Object[] k = (Object[]) c.getArray(4).getArray();

        System.out.println(Arrays.asList(i));
        System.out.println(Arrays.asList(j));
        System.out.println(Arrays.asList(k));
    }
    finally {
        try {
            s.execute("DROP TYPE t_i");
            s.execute("DROP TYPE t_j");
            s.execute("DROP TYPE t_k");
            s.execute("DROP TABLE x");
        }
        catch (sqlException ignore) {}
    }
}

解决方法

有什么办法可以使用RETURNING INTO来获取受影响的行的值?我必须将相同的行插入x次并获取插入的行的ID。

查询如下所示:

public static final String QUERY_FOR_SAVE =
        "DECLARE " +
           " resultId NUMBER ; " +
        "BEGIN " +
           " INSERT INTO x " +
           " (a,b,c,d,e,f,g,h,i,j,k,l,m)  " +
           " values (sequence.nextVal,:a,:b,:c,:d,:e,:f,:g,:h,:i,:j,:k,:l) " +
           " RETURNING a INTO :resultId;" +
        "END;";

现在我可以使用addBatch在JAVA循环中将此查询添加到批处理中

            IntStream.range(0,count)
                .forEach(index -> {
                    try {
                        setting parameters...
                        cs.addBatch();

                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                });
        cs.executeBatch();

有没有办法像这样从批处理中返回数组或列表?我可以仅使用sql来执行x次插入操作,但是在这种情况下,我还想知道如何返回ID数组。

提前致谢

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

猜你在找的编程问答相关文章

怎样才能让 Git“忘记”一个被跟踪但现在在 .gitignore 中的文件?
Python 中的metaclasses是什么?
如何在 Linux 上查找包含特定文本的所有文件?
如何从异步调用返回响应
如何在一个表达式中合并两个字典(取字典的并集)?
HTTP 中的 POST 和 PUT 有什么区别?
使用 Git 将最近的提交移动到新分支
在 JavaScript 比较中应该使用哪个等于运算符 (== vs ===)?
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注