2013-07-03 2 views
1

50 개 행을 반환하는 ResultSet이 있습니다. 나는이 쿼리를 수행 할 수 있도록이 50 개의 행을 삽입하는 임시 테이블을 가져야합니다.결과 집합이 행 수보다 작게 순환합니다.

대체 방법이 없으므로 하위 쿼리 또는 다른 것이 있으면 제안하지 마십시오. 임시 테이블이 필요합니다.

그래서 다음과 같은 방법으로 행을 삽입하고 있는데 분명히 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

당신이 임시 테이블을 필요로 의미, 대신에이 같은 때마다 사용에 쿼리를 실행의 제대로 문제를 이해하면? –

+0

이 삽입 코드를 모두 제거하여 질문의 범위를 좁힐 수 있습니다. 결과 세트에서 인쇄를 그냥 두십시오. –

+0

예 임시 테이블에 삽입하고 있습니다. 루프가 13 회 반복되고 13 개의 행만 삽입되는 동안 이것은 관련 코드라고 생각합니다. print out은 id 문에서 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

나는 Bernice..t @

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

관련 문제