2012-03-16 8 views
4

SQLのストアドプロシージャのようなJDBCを使用してJavaでタスクを実装しようとしています。 SQLでは、カーソルを書くときに、まずselectクエリを実行してから、いくつかのアクションを実行するレコードを取得します。Javaで結果セットをトラバースしながらいくつかのクエリを実行できますか?

おそらく私は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件のレコードをcontansが、私はそれを実行したときに、私の中(res.next())一度だけ実行されます。 (ループのみのSystem.out.println文が含まれていながら)

しかし、その代わりに、クエリの私はちょうど(

sql="select * from tbl_name"; 
res=stmt.executeQuery(sql); 

while(res.next()) 
{ 
    S.O.P.("fields : "+res.getString(0)); 
} 

...それはそれは正常に動作している をフェッチしているかどうかを確認するためにフィールドを表示しよう私は、結果セットがトラバースしているときに、クエリの間にクエリがあると実行されると同時にループが実行され、クエリの実行が終了してからしばらくしてから、reslutsetのループも終了し、一度実行すると分かりません)。

なぜですか私には起こっていない。私が間違っていることは何ですか?

答えて

0

このようなことは起こりません。クエリが実行されるまで試行できます。ループが待機します。

+0

私は以前この種の仕事をしていましたが、それは問題ありませんでした。今私はこの種の問題を抱えています。どうして?私はそれぞれのことを何度もチェックしていますが、得られません。 –

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で囲みます。

0

理想的には、1つのデータベース接続に対して1つの瞬間だけ実行することができるので、2番目のステートメントを作成して実行するか、最初のステートメントから結果セットを反復してコレクションに格納しますハッシュマップのArrayListに)その文を閉じて2つ目を実行し、この時間は、あなたがそれらを保存したコレクションからidを取得する。

+1

1つの接続に対して複数のステートメントを開いても問題ありません。 JDBCはただ一つの 'Statement'に対して複数の' ResultSet'をオープンすることをサポートしていません。 2番目のクエリを作成するために、まったく新しい接続を開く必要はありません。新しい 'Statement'を作成して使用してください。 –

8

Statementは一度に1オープンResultSetを持つことができます。ドキュメントから:デフォルトで

、Statementオブジェクトごとに1つだけのResultSetオブジェクトを同時に 開くことができます。したがって、1つのResultSetオブジェクトの読み取り値が で、別のResultSetオブジェクトの読み取り値とインターリーブされている場合は、異なるStatementオブジェクトによってそれぞれ が生成されている必要があります。 Statement インタフェース内のすべての実行メソッドは、 が存在する場合、そのStatementの現在のResultSetオブジェクトを暗黙的に閉じます。あなたが一列のみを参照してください理由ですので、あなたのループ内executeQuery

呼び出しは暗黙のうち、外側のResultSetを閉じます。

+0

これも試しましたが、実行は同じです(1回だけ実行します。結果の結果セット自体に1行が含まれているかどうかを確認します。 –

+0

私は別のステートメントと結果セットオブジェクトで試しましたが、内側のステートメント実行が外側の結果セットを閉じるようです。この問題は、新しい接続オブジェクトを使用して内部ステートメントを作成するときに解決されます。私は結果セットを反復処理しながら、別の接続オブジェクトを作成することをお勧めしたいと思います。 –

+0

同じ 'Connection'オブジェクトを再利用して、複数の' Statements'を作成して複数のResultSetを返すことができます。 –

関連する問題