Java JDBC while循环前和while循环内的单语句对象

Java JDBC while循环前和while循环内的单语句对象,java,jdbc,resultset,multiple-resultsets,Java,Jdbc,Resultset,Multiple Resultsets,我正在用JDBC编写一个核心java程序来连接Oracle 我正在使用select条件选择我的第一个表,以获得很少的行ID。我在结果集中选择了一些记录 现在我在while循环while resultset.next中循环resultset 然后为ID等于第一个结果集中ID的行选择我的第二个表 在两个选择中,我使用相同的语句对象。在运行程序时,我只得到了第一行的详细信息,然后java抛出了resultset关闭的错误 简而言之,我想知道是否可以在循环之前和循环内部使用一个语句对象 下面是我的代码示

我正在用JDBC编写一个核心java程序来连接Oracle

我正在使用select条件选择我的第一个表,以获得很少的行ID。我在结果集中选择了一些记录 现在我在while循环while resultset.next中循环resultset 然后为ID等于第一个结果集中ID的行选择我的第二个表 在两个选择中,我使用相同的语句对象。在运行程序时,我只得到了第一行的详细信息,然后java抛出了resultset关闭的错误

简而言之,我想知道是否可以在循环之前和循环内部使用一个语句对象

下面是我的代码示例

allCOBbatchRSet=stmt.executeQuery("SELECT RECID FROM V_F_BATCH WHERE BATCH_STAGE IS NOT NULL");
while (allCOBbatchRSet.next())
{
        BatchRSet=stmt.executeQuery("SELECT XMLRECORD FROM F_BATCH WHERE RECID="+cobBatchRecId);
        BatchRSet.next();
        ............
}
它失败了,只有一个例外

java.sql.SQLException: Closed Resultset: next at
oracle.jdbc.driver.InsensitiveScrollableResultSet.ensureOpen(InsensitiveScrollableResultSet.java:109) at
oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:398) at
com.manohar.t24.COBDetails.getCOBDetails(COBDetails.java:46) 

在对该语句创建的结果集进行迭代时,不能重用该语句,因为在该语句对象上执行另一个查询或任何其他语句类型将自动关闭前一个查询执行的结果集。这是JDBCAPI和规范所要求的

如果要执行此操作,则需要禁用自动提交*并使用两个语句对象

但是,您显示的代码是一个反模式,称为N+1查询问题,通常不应在结果集上循环以每行执行其他单独的select:您可以创建一个select语句来执行此操作。这通常表现得更好

例如,您可以使用:

选择V_F_BATCH.RECID、F_BATCH.XMLRECORD 从V_F_批次 内连接F_批 在F_BATCH.RECID=V_F_BATCH.RECID上 其中V_F_BATCH.BATCH_STAGE不为空 这也将避免当前代码可能出现的SQL注入问题


*:禁用自动提交是必要的,因为JDBC需要执行任何语句才能在自动提交模式下提交。提交也会关闭打开的结果集,除非它们在提交时可以保留,尽管一些JDBC驱动程序在这方面比较宽松,并且结果集不会在自动提交边界上关闭。

为什么要用星号?在问题中添加代码片段会给出一些观点,而不是您正在做的事情。为什么要将此逻辑复杂化JAVA你不使用连接吗?大家好,谢谢你们的帮助。我已经添加了我的代码部分。我使用同一个语句对象执行两个不同的SQL Select查询。我的while循环只执行一次,当循环处于第二次迭代时,它失败了,异常为java.sql.SQLException:Closed Resultset:next位于oracle.jdbc.driver.InsensitiveScrollableResultSet.EnsureResultSet.InsureResultSet.java:109位于oracle.jdbc.driver.InsensitiveScrollableResultSet.nextInsensitiveScrollableResultSet.java:398位于com.manohar.t24.COBDetails.GetCobDetails.java:46是的,您吗可以使用一条语句,但一旦从中获得第二个结果集,第一个结果集将无效。