在Java JDBC中将行插入没有更新方法的ResultSet中

时间:2018-10-18 05:20:57

标签: java jdbc resultset sqlexception

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语句类似于:

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 :(得分:1)

  

如何从ResultSet获取UDT类型值(作为结果)   数据库查询)并填充到一个集合中,   集合将在循环之外的另一个过程中使用。

用户定义的类型是Java类,其实例(对象)存储在数据库表列中。 UDT定义为表列数据类型,UDT实例存储为列值。可以在Oracle,Apache Derby等数据库中创建并使用UDT。

使用CREATE TYPE数据库命令定义UDT。 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);
...