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

Posted

技术标签:

【中文标题】在 Java JDBC 中将行插入没有更新方法的 ResultSet【英文标题】:Inserting rows into a ResultSet without update method in Java JDBC 【发布时间】:2018-10-18 05:20:57 【问题描述】:

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 是在 //some code 部分中定义和填充的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

【问题讨论】:

q1) 将它们添加到循环之前定义的 ArrayList 中 请向我们展示所有您计划运行的实际 SQL 代码(与 Java 无关)。您可以通过单个更新/插入查询一次性完成此操作。 然后将其用于循环之外的其他目的 - 这与您的代码有什么关系? @TimBiegeleisen 更新了代码 您可以使用结果集的getObject 并强制转换为UDT 类型(通常是一个类,如MyType)。这样你就有了该类类型的List。要转换的代码:MyType myType = (MyType) rs.getObject(1);. 【参考方案1】:

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

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

UDT 是使用 CREATE TYPE 数据库命令定义的。 UDT 值通过插入/更新 DML 存储在数据库中,并使用 SQL 选择进行查询。与其他数据库数据类型的 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);
...

【讨论】:

非常感谢!它帮助我找到了解决问题的方法:) 另外,我能问一个问题吗,虽然可能有点离题..我可以在 Java 中使用 Oracle 模式中使用的数据类型,而无需再次创建它吗? 我可以在java中使用Oracle模式中使用的数据类型,而无需再次创建它 例如?喜欢将它与另一个表的列类型一起使用? 不,假设我在 Oracle 中创建了一个表类型。我可以在 java 中使用它来将 ArrayList 转换为该表类型吗? 将 ArrayList 转换为该表类型:此语句不清楚。

以上是关于在 Java JDBC 中将行插入没有更新方法的 ResultSet的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中将日期插入 MySQL 数据库表?

Java - JDBC替代品[关闭]

Java - JDBC替代品[关闭]

jdbc-批量插入批量删除批量更新

Java批量插入更新操作

使用 JDBC 和唯一约束进行批量插入