#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]