2013-07-24 76 views
-1

我正在使用Java和SQL庫處理Oracle數據庫。我試圖計算平均值偏離平均值一個標準偏差的學生,添加一列來標記這些學生,並計算有多少學生符合條件並將其添加到新表中。我收到一個錯誤,指出「allAvgs」變量和「theSD」變量「無法解析爲變量」。錯誤發生在我的if語句中,但我已經實例化了這些變量。爲什麼我會得到這個錯誤?任何幫助表示讚賞。無法解析爲變量 - 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

,因爲它們是while(){...}環路內聲明和限定於while()環路的塊範圍。您需要在循環外部聲明它們以擴展其範圍。

// 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

你已經宣佈theSDwhile循環塊內。

//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循環外聲明(並初始化)它(以及所有其他所需)。 考慮如果while循環評估爲false並且未運行,會發生什麼情況。