2013-07-24 5 views
-1

Java 및 SQL 라이브러리를 사용하여 Oracle 데이터베이스로 작업하고 있습니다. 저는 평균이 평균에서 표준 편차만큼 떨어진 학생들을 계산하려고합니다. 그 학생들에게 깃발을 달기위한 칼럼을 추가하고 얼마나 많은 학생들이 기준을 충족시키고 새로운 테이블에 추가하는지 계산합니다. "allAvgs"변수와 "theSD"변수를 "변수로 해석 할 수 없습니다"라는 오류가 나타납니다. if 문에서 오류가 발생하지만 이미 해당 변수를 인스턴스화했습니다. 이 오류가 발생하는 이유는 무엇입니까? 어떤 도움을 주셔서 감사합니다. 그들은 while(){...} 루프 내에 선언하고 while() 루프의 블록 영역에 한정되기 때문에변수로 해결할 수 없음 - JDBC

try{ 
     Statement stOne, stTwo, stThree, stFour; 
     String SelectAverage = "SELECT MEAN FROM STUDENTS"; 
      ResultSet rsOne = stOne.executeQuery(SelectAverage); 

    String TotalAverage = "SELECT Avg(MEAN) AS averages FROM STUDENTS"; 
      ResultSet rsTwo = stTwo.executeQuery(TotalAverage);  

      String student_stan_dev = "SELECT STDEV(MEAN) AS standardDeviation FROM STUDENTS"; 
      ResultSet rsThree = stThree.executeQuery(student_stan_dev); 

      int onesdMean = 1; 


      //Loop Duration_Sec column 
      while(rsOne.next()){ 

      //Convert values into float values 
      float allAvgs = rsOne.getFloat("MEAN"); 
      float totalAvg = rsTwo.getFloat("averages"); 
      float StDev = rsThree.getFloat("standardDeviation"); 

      float theSD = allAvgs - (onesdMean * StDev); 
      } 

     String flaggedStudents = "ALTER TABLE STUDENTS ADD FlaggedStudents INT"; 
     ResultSet rsFour = stFour.executeUpdate(flaggedStudents); 

      if(allAvgs >= theSD){ 
       String FlagHint = "INSERT INTO STUDENTS.FlaggedStudents VALUES('1')"; 
       st.executeUpdate(FlagHint); 
      } 

     String countInstances = "SELECT STUDENTS.NAME, STUDENTS.FlaggedStudents" + 
       "COUNT(*)OVER(PARTITION BY STUDENTS) AS cnt FROM STUDENTS"; 
      st.executeQuery(countInstances); 


     st.executeUpdate("CREATE TABLE IF NOT EXISTS StudentCount" + 
     "(NAME INT , cnt INT)"); 

     String insertVals = String.format("INSERT INTO StudentCount" + 
       "(NAME , cnt INT") + 
       " VALUES ('%s','%s')"); 

     st.execute(insertVals);enter code here 
+1

'theSD'를 선언 한 블록 외부에서 사용할 수 없습니다. 범위를 벗어났습니다. –

+0

둘 다 내 질문에 답변 해 주셔서 감사합니다. 도와 주셔서 감사합니다. – user2554121

답변

1

. 범위를 확장하려면 루프 밖에서 선언해야합니다.

// you need to declare the variables outside 
while(rsOne.next()){ 
    // this defines a scope , anything declared here is invisible outside 
    // this scope 

    float allAvgs = rsOne.getFloat("MEAN"); 
    float totalAvg = rsTwo.getFloat("averages"); 
    float StDev = rsThree.getFloat("standardDeviation"); 
    float theSD = allAvgs - (onesdMean * StDev); 
} 
...... 
...... 
// compiler has no idea about allAvgs and theSD here 
if(allAvgs >= theSD){ 
    String FlagHint = "INSERT INTO STUDENTS.FlaggedStudents VALUES('1')"; 
    st.executeUpdate(FlagHint); 
} 
0

당신은 while 루프 블록의 내부 theSD을 선언했습니다.

//Loop Duration_Sec column 
while(rsOne.next()){ 

    ... 
    float theSD = allAvgs - (onesdMean * StDev); 
} 

하지만 바로 사용하십시오.

... 

if(allAvgs >= theSD){ // theSD doesn't exist in this scope 
    String FlagHint = "INSERT INTO STUDENTS.FlaggedStudents VALUES('1')"; 
    st.executeUpdate(FlagHint); 
} 

루프의 범위 외부에 존재하지 않습니다. while 루프 밖에서 필요로하는 모든 것을 선언하고 초기화해야합니다. while 루프가 false으로 평가되어 실행되지 않으면 어떻게 될지 고려하십시오.

관련 문제