PreparedStatement продолжает вставлять, если ошибка - PullRequest
0 голосов
/ 07 мая 2018

У меня небольшая проблема с Objet PreparedStatement в Java для вставки в базу данных Oracle.

Infect. Я хорошо готовлю модель своего запроса INSERT в PreparedStatement . Я добавляю все свои параметры с addBatch() для каждой записи, которую я хочу вставить.

Я добавляю несколько партий, чтобы вставить, например, 500 записей.

А пока все они работают хорошо, я могу вставить то, что хочу

С другой стороны, в случае, если мой PreparedStatement генерирует ошибку BatchUpdateException (например, нарушение ограничения) в строке 500, которую я хочу вставить, я вообще ничего не вставляю .

Я хочу, чтобы до предела удалить запись, которая вызывает беспокойство (с нарушением ограничения) и вставить по крайней мере 499 строки, которые в порядке

Как я могу это сделать? если она даст мне трек, я буду благодарен.

Просто для информации я хочу вставить несколько строк обводки из 500 строк, поэтому решение для вставки строка за строкой не подходит мне слишком сильно.

1026 * Сердечно *

1 Ответ

0 голосов
/ 07 мая 2018

возможно, это не то, что вы хотите, но у oracle есть встроенная логика ошибок

вы должны создать таблицу ошибок например если таблица называется emp, запустите эту команду

exec dbms_errlog.create_error_log(dml_table_name=>'emp');

, которая создаст таблицу с ошибкой $ _emp, которая перехватит ошибки

тогда вы можете сделать что-то подобное ниже (обратите внимание на ошибки журнала в предложении)

пакет будет выполнен успешно, и вам придется проверять таблицу ошибок на наличие ошибок после ее запуска

import java.sql.*;


public class Class1 {

    public static void main(String[] args) throws SQLException {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  

        PreparedStatement preparedStatement;
        int records = 20;

        try {
            Connection connection = DriverManager.getConnection(  
                    "jdbc:oracle:thin:@//host/db","scott","tiger");

            String compiledQuery = "INSERT INTO EMP(EMPNO)" +
                    " VALUES" + "(?) LOG ERRORS INTO ERR$_EMP REJECT LIMIT UNLIMITED";
            preparedStatement = connection.prepareStatement(compiledQuery);

            for(int index = 1; index <= records; index++) {
                preparedStatement.setInt(1, index);
                preparedStatement.addBatch();
            }

            long start = System.currentTimeMillis();

            int[] inserted;

            try {
                inserted = preparedStatement.executeBatch();
            }
            catch (SQLException e)
            {
                System.out.println("sql error");
            }
            long end = System.currentTimeMillis();

            System.out.println("total time taken to insert the batch = " + (end - start) + " ms");
            System.out.println("total time taken = " + (end - start)/records + " s");

            preparedStatement.close();
            connection.commit();
            connection.close();



        } catch (SQLException ex) {
            System.err.println("SQLException information");
            while (ex != null) {
                System.err.println("Error msg: " + ex.getMessage());
                ex = ex.getNextException();
            }
            throw new RuntimeException("Error");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...