我正试图在java中使用类似JDBC的SQL存储过程来实现一项任务。在SQL中,当我们编写游标时,首先执行select查询,然后获取记录,我们执行一些操作。
很可能我在配置单元中激发了一个选择查询。
sql="SELECT a,c,b FROM tbl_name";
res=stmt.executeQuery(); -----------> CONTAINS 30 RECORDS
while(res.next())
{
sql="INSERT INTO table .....";
rs1=stmt.executeQuery();
sql="SELECT d,e,f FROM table .....";
rs1=stmt.executeQuery();
like wise many queries are there.....
.
.
.
..
}
由于我的select查询包含30条记录,但当我执行它时,while(res.next())只执行一次。
但我只是尝试显示字段来检查它是否正在获取,而不是查询那么它工作得很好。。(当循环只包含System.out.println语句时)
sql="SELECT * FROM tbl_name";
res=stmt.executeQuery(sql);
while(res.next())
{
S.O.P.("fields : "+res.getString(0));
}
(我认为,当遍历结果集时,如果在查询之间有查询,那么查询会被执行,但同时循环也会被执行。一段时间后,当查询执行结束时,结果集的循环也会结束,因此它会执行一次。我不确定。)
我不明白为什么会发生这种事。我做错了什么吗?
每个Statement
一次只能有一个打开的ResultSet
。来自文件:
默认情况下,每个Statement对象只能打开一个ResultSet对象同时因此,如果读取一个ResultSet对象与另一个的读取交错,每个都必须生成通过不同的Statement对象。语句中的所有执行方法如果存在一个开放的。
循环中对executeQuery
的调用将隐式关闭外部ResultSet
,因此您只能看到一行。
我会重组您的流程。首先,不要尝试重用同一个Statement
对象来执行新查询。例如,当我尝试使用PostgreSQL驱动程序时,我很容易得到一个异常,"This ResultSet is closed"
相反,将其重写为这样的内容:
Connection conn = DriverManager.getConnection(...);
Statement outerStatement = conn.createStatement();
ResultSet outerResultSet = outerStatement.executeQuery("...");
while (outerResultSet.next()) {
Statement innerStatement = conn.createStatement();
ResultSet innerResultSet = innerStatement.executeQuery("...");
while (innerResultSet.next()) {
// ...
}
innerResultSet.close();
innerStatement.close();
}
outerResultSet.close();
outerStatement.close();
conn.close();
当然,根据需要用try-catch-finally
包围。
情况并非如此,您可以尝试直到您的查询被执行,循环将等待。
理想情况下,在一个数据库连接上一次只能执行一条语句,因此您可以创建并执行第二条语句,也可以迭代第一条语句的结果集并将数据存储在集合中(例如,在hashmap的arraylist中),然后关闭该语句并运行第二条,这一次从您保存的集合中检索id。