не удается обновить набор строк JDBC с помощью базы данных Oracle

#oracle #jdbc #rowset

#Oracle #jdbc #набор строк

Вопрос:

Мне нужно обновить некоторые строки в наборе строк, но когда я пытаюсь это сделать, я получаю исключение, не подлежащее обновлению. Почему?

 JdbcRowSet rs = new oracle.jdbc.rowset.OracleJDBCRowSet(con);
rs.setCommand("SELECT status FROM s");
rs.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
rs.setUsername("username");
rs.setPassword("password");
rs.setReadOnly(false);
rs.execute();

 // this doesn't work
rs.last();
rs.deleteRow();
 // this doesn't work too
rs.absolute(2);
rs.updateInt("status", 10);
rs.updateRow();
  

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

1. Что является фактическим исключением? Дьявол кроется в деталях.

Ответ №1:

Я полагаю, что исключение, которое вы получаете, это

java.sql.SQLException: недопустимая операция для результирующего набора только для чтения: deleteRow

или что-то подобное. Это было то, что я увидел во время тестирования вашего кода.

Честно говоря, я не видел, чтобы класс OracleJDBCRowSet использовался раньше. Я не был слишком уверен, как изменить ваш код, чтобы обойти ошибку, которую вы видели. Однако не так уж сложно сделать ваш код более похожим на «традиционный» JDBC, сохранив при этом возможность изменять результирующий набор в Java. Все, что вам действительно нужно сделать, это передать два дополнительных параметра в prepareStatement вызов метода:

 Connection con = DriverManager.getConnection(
    "jdbc:oracle:thin:@localhost:1521:orcl", "username", "password");

Statement stmt = con.prepareStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

ResultSet rs = stmt.executeQuery("SELECT status FROM s");

/* this should work */
rs.last();
rs.deleteRow();
/* this should also work */
rs.absolute(2);
rs.updateInt("status", 10);
rs.updateRow();
  

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

1. Ну, согласно документации , набор строк может быть отключен (CachedRowSet), поэтому это позволяет мне изменять данные без какого-либо подключения, это то, что мне нужно. Но спасибо вам за помощь. Ваш код также работает для меня.