Вставка строк в ResultSet без метода обновления в Java JDBC - PullRequest
0 голосов
/ 18 октября 2018

Q1: у меня есть цикл, внутри которого есть оператор выбора.Теперь я хочу накапливать все эти строки из оператора select в ResultSet, а затем использовать его для других целей вне цикла.Как мне этого добиться?

while(rs.next()){
  //some code..
  String sql2 = "select cast(multiset(select *  from table(sys.dbms_debug_vc2coll("+ar.toString().replace("[","").replace("]","")+"))) as UDT),"+rn+" as test from dual"; //returns a user defined datatype which is defined in my db schema
            PreparedStatement ps2=conn.prepareStatement(sql2,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            ResultSet rs2 = ps2.executeQuery(); //I need to use rs2 with all selected rows, outside the loop
            rs2.moveToInsertRow();
            rs2.updateObject(1, "update"); //why?
            rs2.insertRow(); 
   }

rs, вот еще один ResultSet.UDT - это определяемый пользователем тип данных в моей схеме БД, а ar - это ArrayList, определенное и заполненное // в некоторой части кода.

Кроме того, необработанный оператор выбора выглядит примерно так:

select cast(multiset(select *  from table(sys.dbms_debug_vc2coll(1, 2, 33, 342))) as s9t_cells) from dual; //example

Q2: Для меня не имело смысла, зачем мне вообще обновлять объект ResultSet.Я просто хочу получить строки из оператора select и поместить их в ResultSet.Но в процессе указано (согласно https://www.ibm.com/support/knowledgecenter/en/SSEPEK_11.0.0/java/src/tpc/imjcc_t0052611.html), что я должен добавить UpdateXXX метод.Если не добавлено, я получаю следующую ошибку:

java.sql.SQLException: Undefined column value on the insert row

1 Ответ

0 голосов
/ 18 октября 2018

Как получить значения типа UDT из ResultSet (в результате запроса к базе данных) и заполнить коллекцию, а данные из коллекции будут использоваться в другой процедуре - вне цикла.

Пользовательский тип - это класс Java, экземпляры (объекты) которого хранятся в столбцах таблицы базы данных.UDT определяются как тип данных столбца таблицы, а экземпляры UDT сохраняются как значения столбца.UDT можно создавать и использовать в базах данных, таких как Oracle, Apache Derby и т. Д.

UDT определяется с помощью команды базы данных CREATE TYPE.Значение UDT сохраняется в базе данных через DML-код вставки / обновления и запрашивается с использованием SQL Select.Как и UDT других типов данных базы данных, можно работать с использованием API JDBC или в интерактивном режиме с использованием SQL.

Предполагая, что тип UDT относится к классу Java MyType.java, с использованием JDBC для вставки / обновления значения UDT код можетбыть таким:

    MyType myType = new MyType(); // an instance of the UDT type's Java class MyType
    preparedStatement.setObject(1, myType);
    preparedStatement.executeUpdate();

Чтобы извлечь из базы данных и заполнить коллекцию:

List<MyType> myTypesList = new ArrayList<>();
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
    MyType myType = (MyType) rs.getObject(1);
    // ... other columns
    myTypesList.add(myType);
}
...

// Call a method that uses the myTypesList
processMyTypesFromDb(myTypesList);
...
...