2013-07-03 44 views
1

我有一個返回50行的ResultSet。我需要一個臨時表,我可以在其中插入這50行,以便我可以對其執行查詢。ResultSet循環少於行數

有沒有其他的選擇,所以請不要建議有子查詢或其他東西。臨時表是必需的。

所以我用下面的方法插入行,顯然雖然我知道ResultSet由50行組成,但它在while循環中只循環了13次,因此當我從這個表中提取一些字段時,我沒有要求的結果。

public void insertValues(Connection con, ResultSet rs) { 

    StringBuffer insert_into_temp = new StringBuffer(); 

    try { 
     ResultSetMetaData rsmd = rs.getMetaData(); 
     int colCount = rsmd.getColumnCount(); 


     insert_into_temp.append("INSERT INTO SESSION.RETURNED_TICKETS ("); 

     for (int i = 1; i <= colCount; i++) { 
      insert_into_temp.append(rsmd.getColumnLabel(i)); 
      insert_into_temp.append(","); 
     } 

     insert_into_temp.deleteCharAt(insert_into_temp.length()-1); 
     insert_into_temp.append(")"); 

     insert_into_temp.append("\nVALUES("); 

     // number of place-holders for values 
     for (int i = 0; i < colCount; i++) { 
      insert_into_temp.append("?,"); 
     } 

     insert_into_temp.deleteCharAt(insert_into_temp.length()-1); 
     insert_into_temp.append(")"); 

     while(rs.next()){ 
      PreparedStatement pstmt = con.prepareStatement(insert_into_temp.toString()); 

      pstmt.setInt(1, rs.getInt(Ticket.FLD_ID)); 
      pstmt.setString(2, rs.getString(Ticket.FLD_DESCRIPTION)); 
      pstmt.setInt(3, rs.getInt(Ticket.FLD_TICKETTYPE)); 
      pstmt.setString(4, rs.getString("STATE")); 
      pstmt.setString(5, rs.getString("PRIORITY")); 
      pstmt.setString(6, rs.getString("OWNER")); 
      pstmt.setString(7, rs.getString("SUBMITTER")); 
      pstmt.setString(8, rs.getString("TYPE")); 
      pstmt.setString(9, rs.getString(Ticket.FLD_TITLE)); 
      pstmt.setString(10, rs.getString("PROJECT")); 
      pstmt.setInt(11, rs.getInt("PROJID")); 
      pstmt.setDouble(12, rs.getDouble("RELEASE")); 
      pstmt.setTimestamp(13, rs.getTimestamp(Ticket.FLD_SUBMITDATE)); 
      pstmt.setInt(14, rs.getInt(Ticket.FLD_CUSTOMER)); 
      pstmt.setInt(15, rs.getInt("ROW_NEXT")); 

      int success = pstmt.executeUpdate(); 

      if (success != 1) // if not successful 
       throw new SQLException("Failed to insert values into temporary table for linked/unlinked tickets"); 

     } 

    } catch (SQLException e){ 
     LogFile.logError("[Report.execute()] "+e.getMessage()); 
     LogFile.logError(insert_into_temp.toString()); 
    } 
} 

可能是什麼問題?我無法弄清楚爲什麼會發生這種情況。 謝謝

+0

@ Bernice..t意味着你需要臨時表? – 2013-07-03 11:59:53

+0

您可以通過刪除所有此插入代碼來縮小您的問題範圍。只需從結果集中打印出來即可。 –

+0

是的,我插入臨時表。但是這是while循環只循環13次,只有13行被插入,所以我認爲這是相關的代碼。打印輸出只是從聲明中的where ID中選擇 – Bernice

回答

-2

這並不回答你的問題,但它確實顯示瞭如何避免爲每次迭代創建準備好的語句。相反,您可以準備一次,然後在每次迭代中綁定不同的值。

public void insertValues(Connection con, ResultSet rs) { 
    try { 

     StringBuffer insert_into_temp = new StringBuffer(); 

     ResultSetMetaData rsmd = rs.getMetaData(); 
     int colCount = rsmd.getColumnCount(); 

     insert_into_temp.append("INSERT INTO SESSION.RETURNED_TICKETS ("); 

     for (int i = 1; i <= colCount; i++) { 
      insert_into_temp.append(rsmd.getColumnLabel(i)); 
      insert_into_temp.append(","); 
     } 

     insert_into_temp.deleteCharAt(insert_into_temp.length()-1); 
     insert_into_temp.append(")"); 

     insert_into_temp.append("\nVALUES("); 

     // number of place-holders for values 
     for (int i = 0; i < colCount; i++) { 
      insert_into_temp.append("?,"); 
     } 
     insert_into_temp.deleteCharAt(insert_into_temp.length()-1); 
     insert_into_temp.append(")"); 

     PreparedStatement pstmt = con.prepareStatement(insert_into_temp.toString()); 

     while (rs.next()) { 

      pstmt.setInt(1, rs.getInt(Ticket.FLD_ID)); 
      pstmt.setString(2, rs.getString(Ticket.FLD_DESCRIPTION)); 
      pstmt.setInt(3, rs.getInt(Ticket.FLD_TICKETTYPE)); 
      pstmt.setString(4, rs.getString("STATE")); 
      pstmt.setString(5, rs.getString("PRIORITY")); 
      pstmt.setString(6, rs.getString("OWNER")); 
      pstmt.setString(7, rs.getString("SUBMITTER")); 
      pstmt.setString(8, rs.getString("TYPE")); 
      pstmt.setString(9, rs.getString(Ticket.FLD_TITLE)); 
      pstmt.setString(10, rs.getString("PROJECT")); 
      pstmt.setInt(11, rs.getInt("PROJID")); 
      pstmt.setDouble(12, rs.getDouble("RELEASE")); 
      pstmt.setTimestamp(13, rs.getTimestamp(Ticket.FLD_SUBMITDATE)); 
      pstmt.setInt(14, rs.getInt(Ticket.FLD_CUSTOMER)); 
      pstmt.setInt(15, rs.getInt("ROW_NEXT")); 

      int success = pstmt.executeUpdate(); 

      if (success != 1) // if not successful 
       throw new SQLException("Failed to insert values into temporary table for linked/unlinked tickets"); 

     } 

    } catch (SQLException e){ 
     LogFile.logError("[Report.execute()] "+e.getMessage()); 
     LogFile.logError(insert_into_temp.toString()); 
    } 
} 
0

如果我理解正確的問題,而是在每一次使用這樣執行查詢的,

con.setAutoCommit(false); while (rs.next()) { // your setting values on prepared statement code pstmt.addBatch(); } pstmt.executeBatch(); con.setAutoCommit(true);