Пакетная вставка JDBC с возвращаемым предложением

#oracle #jdbc #batch-insert

#Oracle #jdbc #пакетная вставка

Вопрос:

Есть ли какой-либо способ получить значения затронутых строк с помощью возвращаемого предложения в JAVA при использовании оператора пакетной вставки JDBC? Я могу получить требуемые значения для одной затронутой строки.Но не для всех пакетных вставок?

Код :

 try {
    String query = "INSERT INTO temp ( "
                   "org_node_id, org_node_category_id,  org_node_name, "
                   "customer_id, created_by, created_date_time, "
                   "updated_date_time, activation_Status )"
                   " VALUES (seq_org_node_id.nextval,  11527,  'Abcd',  9756,  1,  sysdate,   sysdate,   'AC')"
     " returning org_node_id, org_node_name INTO ?, ?";

    con = DBUtils.getOASConnection();

    OraclePreparedStatement ps = (OraclePreparedStatement) con.prepareStatement(query);
    ps.registerReturnParameter(1, Types.INTEGER);
    ps.registerReturnParameter(2, Types.VARCHAR);
    ps.execute();

    ResultSet rs = ps.getReturnResultSet();
    rs.next();

    System.out.println("Org ID : "  rs.getInt(1));
    System.out.println("Org Name : "  rs.getString(2));

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

Комментарии:

1. пожалуйста, покажите код, который вы внедрили

2. Да, это одиночная вставка, но как получить тот же результат для массовых вставок? Я столкнулся с проблемой в этой области.

3. @Somenath Взгляните на это , возможно, это поможет.

4. rs.next(); должно быть while(rs.next()), чтобы отобразить весь набор результатов

5. Если вы проверите глава 4.6.4 Ограничения возврата DML в Руководстве разработчика JDBC docs.oracle.com/en/database/oracle/oracle-database/18/jjdbc / … вы видите, что «Возврат DML не может быть объединен с пакетным обновлением»..

Ответ №1:

Пакетная INSERT .. RETURNING обработка инструкций не поддерживается ojdbc, но массовая вставка может работать с помощью команды PL / SQL FORALL .

Дана таблица…

 CREATE TABLE x (
  i INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, 
  j VARCHAR2(50), 
  k DATE DEFAULT SYSDATE
);
 

…и типы…

 CREATE TYPE t_i AS TABLE OF NUMBER(38);
/
CREATE TYPE t_j AS TABLE OF VARCHAR2(50);
/
CREATE TYPE t_k AS TABLE OF DATE;
/
 

… вы можете обойти это ограничение, запустив массовую вставку и массовый сбор результатов (как я также показал в этом сообщении в блоге) следующим образом:

 try (Connection con = DriverManager.getConnection(url, props);
    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;")) {

    // 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));
}
 

Результаты:

 [1, 2, 3]
[a, b, c]
[2018-05-02 10:40:34.0, 2018-05-02 10:40:34.0, 2018-05-02 10:40:34.0]