我正在尝试使用JDBC(如SQL中的存储过程)在Java中实现任务。 在SQL中,当我们编写游标时,首先执行select查询,然后获取我们执行某些操作的记录。
可能我在Hive中解雇了一个选择查询。
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.....
.
.
.
..
}
由于我的选择查询包含30条记录,但是当我执行它时,我只执行一次(res.next())。
但是我只是尝试显示字段来检查它是否正在获取而不是查询 然后它工作正常.. (while循环只包含System.out.println语句)
sql="SELECT * FROM tbl_name";
res=stmt.executeQuery(sql);
while(res.next())
{
S.O.P.("fields : "+res.getString(0));
}
(我认为当结果集被遍历时,如果查询之间存在,那么查询将被执行但同时循环也会执行,并且在查询执行结束后的一段时间之后,结果集的while循环也会执行得到完成,因此它会执行一次。我不确定。)
为什么会这样,我没有得到。我做错了什么?
答案 0 :(得分:11)
每个Statement
一次只能打开一个ResultSet
。来自文档:
默认情况下,每个Statement对象只能打开一个ResultSet对象 同时。因此,如果读取一个ResultSet对象是 与另一个的读取交错,每个必须已经生成 通过不同的Statement对象。 Statement中的所有执行方法 如果是,接口隐式关闭一个statment的当前ResultSet对象 打开一个。
循环中对executeQuery
的调用将隐式关闭外部ResultSet
,因此您只能看到一行。
答案 1 :(得分:2)
我会重组你的流程。首先,不要尝试重用相同的Statement
对象来执行新查询。例如,当我尝试使用PostgreSQL驱动程序时,我很容易得到一个例外,“此ResultSet已关闭。”
相反,将其重写为以下内容:
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
进行环绕。
答案 2 :(得分:0)
不会发生这种情况,您可以尝试直到执行查询循环将等待。
答案 3 :(得分:0)
理想情况下,您只能在一个时刻针对一个数据库连接执行一个语句,因此您可以创建并执行第二个语句,或者从第一个语句遍历结果集并将数据存储在集合中(例如,在arraylist中)然后关闭该语句并运行第二个语句,这次从您保存它们的集合中检索id。