在 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的主要内容,如果未能解决你的问题,请参考以下文章