테이블 COMPA를 테이블 COMPA에 기반한 테이블 COMPB의 업데이트 및 삭제 작업으로 TABLE COMPA와 동일하게 만들려고합니다. 이 코드는 적절한 SQL을 생성하는 동안 완벽하게 작동합니다. 문제는, 내가 루프를 첫 번째 반복 자체에서 종료하는 동안 실행 문을 넣어 아래와 같습니다. 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);
}
}
후속 executeUpdate() 호출에 대해 stmt를 재사용하는 것을 좋아하지 않는다고 생각하지만 어떤 디버깅을 했습니까? 수동으로 실행하는 경우 초기 쿼리는 무엇입니까? 모든 세션의 모든 변경 사항이 커밋되었다고 가정합니다. 또한, 왜 하나의 병합 문 대신 루프를 사용하십시오; 루프를 사용해야하는 경우 준비된 문과 변수를 바인드하지 않는 이유는 무엇입니까? –
감사합니다. Alex. 루프 내에서 stmt를 재사용하는 것이 문제였습니다. 나는 while 루프를 어떻게 깨뜨릴 수 있는지 아직 이해하지 못하고있다. 그러나 지금은 그것을 고쳤습니다. –
값 문자열을 쿼리 문자열로 연결하는 것을 중단하고 대신 매개 변수 자리 표시자가있는 준비된 문을 사용하는 것이 좋습니다. 현재 코드가 안전하지 않고 SQL 인젝션에 취약합니다. –