2011-08-25 4 views
0

나는 쿼리를 실행하기로되어있는 3 레벨 중첩 루프가 있지만 더 큰 웹 서비스의 일부이지만 가장 바깥 쪽 루프는 다음과 같이 절반 만 실행된다.3 레벨 중첩 루프 쿼리는 외부 루프를 실행하지 않을 것이다

 PreparedStatement ps = conn.prepareStatement("INSERT INTO malattia (nome, eta, descrizione, sesso, etnia, sintomi) values (?, ?, ?, ?, ?, ?)"); 


       if(sexarra.length == 2){ 

        for(int k=0; k<sexarra.length; k++) { 
        for(int i=0; i<selec.length; i++){ 
         for(int j=0;j<sintom.length;j++){ 

         ps.setString(1, malattia); 
         ps.setInt(2, eta); 
         ps.setString(3, descrizione); 
         ps.setString(4, sexarra[k]); 
         ps.setString(5, selec[i]); 
         ps.setString(6, sintom[j]); 
         ps.executeUpdate(); 
         } 
        } 
        } 
      } 
       else { 

        for(int i=0; i<selec.length; i++){ 
         for(int j=0;j<sintom.length;j++){ 

         ps.setString(1, malattia); 
         ps.setInt(2, eta); 
         ps.setString(3, descrizione); 
         ps.setString(4, sexarra[0]); 
         ps.setString(5, selec[i]); 
         ps.setString(6, sintom[j]); 
         ps.executeUpdate(); 

         } 

        }     
       } 

       ps.close(); 
       //ds.close(); 
       conn.close(); 
       ris = "si"; 
       } catch (SQLException e) { 
        System.out.println("Errore: " + e.getMessage()); 

        return ris; 
       } 
     } 
     return ris; 
} 

문제는 완료, 정확하게 가장 바깥 쪽 두 번 반복하도록되어 루프,하지만 프로그램에 즉시 = 0 k에 대한 루프를 예외가 발생 sexarra.lengh=2 첫 번째 부분 낳는, I K=1과 관련된 루프를 실행하지 않는다는 의미입니다. 나중에 중첩 루프에 문제가 발생하여 preparedstatement 일이 가장 최근의 일이며, 내가 뭘 잘못하고 있는지 모릅니다. 시간과 노력에 감사드립니다.

+0

올바르게 읽을 수 있도록 코드를 올바르게 포맷 할 수 있습니까? 또한, 예외가 발생했다는 말입니까? 이 경우 예외 사항을 질문의 일부로 넣어주십시오. – momo

+1

0에서 대답을 수락 한 것은별로 고무적이지 않습니다. –

+0

@momo 나는 catch (SQLException e)가 활성화 되었기 때문에 예외가 throw되지만이 코드는 웹 서비스의 서버 측에서 실행 중이므로 "ris"만 반환된다는 사실을 알지 못합니다. 고객 입장에서. – tutak

답변

0

나는 서버 로그를보고 답변을 발견, @ 스티븐 C는 코멘트에 의해 오류가 쿼리의 실행을 거부로 인해 발생했다, 아웃터 루프가 다른 가치를 전달하는 동안 다른 값은 동일하게 유지되었지만 아웃 태터가 전달한 값은 테이블의 기본 키가 아니므로 쿼리가 효과적으로 중복되었습니다.

1

내가 프로그램의 논리를 아직 시도,하지만 난 당신이 내가 다시 인스턴스를 잡는없이 준비된 문 매개 변수를 재설정하는 경우를 사용한 적이 Reusing a PreparedStatement multiple times

볼 제안 (poolpreparedstatement는 캐시로 사용할 수 있습니다 성명서). 그게 여기에 문제가 될 수도

+0

실행 준비된 문이 필요합니다 (sintom.lengh * selec.length) * sexarra.length times 여기서 sexarra.length == 2. 아웃터 루프는 절반 (sintom.length * selec.length) * 1 번만 실행됩니다. – tutak

+0

제 제안은 모든 ps.update 후에 준비된 명령문을 닫고로드하는 것입니다. – Fazal

+0

감사합니다. 그러나 문제가 해결되었습니다. 나는 내일까지 대답 할 수 없다. 그렇게하지 못하게해라. – tutak