テーブルCOMPAに基づくテーブルCOMPBの更新と削除操作によって、TABLE COMPAをTABLE COMPAと同等にしようとしています。このコードは、適切なSQLを生成しながら完璧に動作します。問題は、次のようにexecute文を置いた瞬間ですが、ループは最初の繰り返しで終了します。 JavaのResultSetのこの動作を理解できません。どんな助け?どこが間違っていますか?WhileループがResultSet.executeの後で終了する
//Comparision between Minus Table(seta) and COMPB (setc)
//ID Contains Primary Key of COMPB Table
ResultSet seta=stmt.executeQuery("select * from COMPA minus select * from COMPB");
while(seta.next())
{
String insert="";
String update="";
boolean contains=ArrayUtils.contains(ID, seta.getInt(1));
if (contains==true)
{
update="Update COMPB SET COMPB.EMPNAME='"+seta.getString(2)+"',COMPB.EMAILID='"+seta.getString(3)+"' where "+seta.getInt(1)+"=COMPB.EMPID";
stmt.executeUpdate(update);
System.out.println(update);
}
else
{
insert="Insert INTO COMPB values ("+seta.getInt(1)+" , '"+seta.getString(2)+"' , '"+seta.getString(3)+"')";
stmt.executeUpdate(insert);
System.out.println(insert);
}
}
手動で実行すると、最初のクエリはどのようになりますか?すべてのセッションのすべての変更がコミットされていると仮定します。また、なぜ1つのマージステートメントの代わりにループを使用するか。ループを使用する必要がある場合、なぜプリペアドステートメントとバインド変数を使用していないのですか? –
ありがとうアレックス。ループ内でのstmtの再利用が問題でした。 whileループをどうやって破ることができるのかまだ分かりません。しかし、今はそれを修正しました。 –
値をクエリ文字列に連結しないようにすることを強くお勧めします。代わりに、パラメータプレースホルダを持つプリペアドステートメントを使用してください。現在のコードは安全ではなく、SQLインジェクションに対して脆弱です。 –