Q1:我有一个循环,里面有一个select语句。现在,我想将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语句类似于:
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
如何从ResultSet中获取UDT类型值(作为数据库查询)并填充到集合中集合将在循环之外的另一个过程中使用。
用户定义的类型是一个Java类,其实例(对象)存储在数据库表列中。UDT定义为表列数据类型,UDT实例存储为列值。UDT可以在Oracle、Apache Derby等数据库中创建和使用。
UDT是使用CREATE TYPE数据库命令定义的。UDT值通过插入/更新DML存储在数据库中,并使用SQL Select进行查询。与其他数据库数据类型的UDT一样,可以使用JDBC API进行处理,也可以使用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);
...