我假设这是关于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) {} }}


