2016-11-07 2 views
-1
public ResultSet validatePayments() { 

    ConnectionPool connPool = null; 
    Connection dbConn = null; 
    Connection dbUpdatConn = null; 
    CallableStatement callableStatement = null; 
    PreparedStatement psmt = null; 
    ResultSet rs = null; 
    CachedRowSetImpl crs = null; 
    Statement stmt = null; 
    List<UpdatePaymentResult> upr = new ArrayList<UpdatePaymentResult>(); 
    String sqlStatement = "{call myschema.mypkg.sp_get_new_payments(?)}"; 
    String updateSql = "UPDATE temp SET stats= ? ,THREAD = ? WHERE P_NUM = ? "; 
    try { 
     Logger.log(Logger.DEBUG, "SQL=" + sqlStatement, 
       "Creating Connection ...."); 
     connPool = ConnectionPool.getConnectionPool(); 
     dbConn = connPool.getConnection(); 
     callableStatement = dbConn.prepareCall(sqlStatement, 
       ResultSet.TYPE_SCROLL_INSENSITIVE, 
       ResultSet.CONCUR_UPDATABLE); 
     callableStatement.registerOutParameter(1, OracleTypes.CURSOR); 
     callableStatement.executeQuery(); 
     rs = (ResultSet) callableStatement.getObject(1); 
     crs = new CachedRowSetImpl(); 
     crs.populate(rs); 

     dbUpdatConn = connPool.getConnection(); 
     psmt = dbUpdatConn.prepareStatement(updateSql); 
     Logger.log(Logger.DEBUG, "SQL=" + "", 
       "prepared statement started.... "); 
     while (rs.next()) { 
      Logger.log(Logger.DEBUG, "SQL=" + "", 
       "inside loop started.... "); 
      UpdatePaymentResult up = new UpdatePaymentResult(); 
      up.setPaymentReqNum(rs.getString("P_NUM")); 

      upr.add(up); 
      for (UpdatePaymentResult updatePaymentResult : upr) { 
       psmt.setString(1, processing); 
       psmt.setString(2, "my payment thread"); 
       psmt.setString(3, updatePaymentResult.getPaymentReqNum()); 
       psmt.executeUpdate(); 
      } 
     } 
     Logger.log(Logger.DEBUG, "SQL=" + "", 
       "prepared statement started.... "); 
    } catch (Exception e) { 
     Logger.log(Logger.RECEIVER, "Error while getting Payment record " 
       + e, "selectNew :"); 

    } finally { 
     try { 
      if (rs != null) 
       rs.close(); 
      if (callableStatement != null) 
       callableStatement.close(); 
      if (psmt != null) 
       psmt.close(); 
      if (connPool != null && dbConn != null) { 
       dbConn.setAutoCommit(true); 
       connPool.returnConnection(dbConn); 
      } 
     } catch (SQLException e) { 
      Logger.log(Logger.Debug, 
        "Error whilst getting Payment record" + e, "hello"); 
     } 
    } 
    return crs; 
} 

Привет,Как выбрать и обновить набор результатов?

Я пытаюсь выбрать список значений из БД и передаст результат к другому классу. В то же время я хотел бы принять номер платежа и обновить статус до «обработки». Как только я передаю результирующий набор другому методу, он обновит статус до «обработанного». я сохранил некоторые регистраторы внутри цикла, и у нас также есть таблица аудита. Я не могу видеть статус обработки. Можете ли вы просить кого-то помочь, какую ошибку я делаю.

+0

ResultSet не должен оставаться открытым и проходить мимо. Скопируйте ResultSet в список объектов Payment. Верните объекты списка платежей. Ваш метод validatePayments делает слишком много вещей. Разбейте свой метод на многие более мелкие методы. –

+0

Что случилось с вашим текущим кодом? –

+0

его устаревший код, если я изменяю подпись метода вызова, мне нужно внести такие изменения во множество мест. вызывающий метод ожидает результатов. – user3647134

ответ

0

Проблема в том, что вы пытаетесь сделать preparedStatement.update во время итерации resultset.

Чтобы сделать его легко работать, выполните следующие действия:

  1. итерацию по resultset и скопировать все даты list первого

  2. Теперь сделайте update для каждой записи в list

Вы можете посмотреть на код ниже:

public ResultSet validatePayments() { 
    ConnectionPool connPool = null; 
    Connection dbConn = null; 
    Connection dbUpdatConn = null; 

    CallableStatement callableStatement = null; 
    PreparedStatement psmt = null; 
    ResultSet rs = null; 
    CachedRowSetImpl crs = null; 
    Statement stmt = null; 

    List<UpdatePaymentResult> upr = new ArrayList<UpdatePaymentResult>(); 
    String sqlStatement = "{call myschema.mypkg.sp_get_new_payments(?)}"; 
    String updateSql = "UPDATE temp SET stats= ? ,THREAD = ? WHERE P_NUM = ? "; 

    try { 
     Logger.log(Logger.DEBUG, "SQL=" + sqlStatement, 
       "Creating Connection ...."); 
     connPool = ConnectionPool.getConnectionPool(); 
     dbConn = connPool.getConnection(); 
     callableStatement = dbConn.prepareCall(sqlStatement, 
       ResultSet.TYPE_SCROLL_INSENSITIVE, 
       ResultSet.CONCUR_UPDATABLE); 
     callableStatement.registerOutParameter(1, OracleTypes.CURSOR); 
     callableStatement.executeQuery(); 
     rs = (ResultSet) callableStatement.getObject(1); 
     crs = new CachedRowSetImpl(); 
     crs.populate(rs); 

     dbUpdatConn = connPool.getConnection(); 

     Logger.log(Logger.DEBUG, "SQL=" + "", 
       "prepared statement started.... "); 
     while (rs.next()) { 
      Logger.log(Logger.DEBUG, "SQL=" + "", 
       "inside loop started.... "); 
      UpdatePaymentResult up = new UpdatePaymentResult(); 
      up.setPaymentReqNum(rs.getString("P_NUM")); 

      //only add to list here 
      upr.add(up); 
     } 

     //Now update each entry in the list 
     psmt = dbUpdatConn.prepareStatement(updateSql); 
     for (UpdatePaymentResult updatePaymentResult : upr) { 
       psmt.setString(1, processing); 
       psmt.setString(2, "my payment thread"); 
       psmt.setString(3, updatePaymentResult.getPaymentReqNum()); 
       psmt.executeUpdate(); 
     } 

     Logger.log(Logger.DEBUG, "SQL=" + "", 
       "prepared statement started.... "); 
    } catch (Exception e) { 
     Logger.log(Logger.RECEIVER, "Error while getting Payment record " 
       + e, "selectNew :"); 

    } finally { 
     try { 
      if (rs != null) 
       rs.close(); 
      if (callableStatement != null) 
       callableStatement.close(); 
      if (psmt != null) 
       psmt.close(); 
      if (connPool != null && dbConn != null) { 
       dbConn.setAutoCommit(true); 
       connPool.returnConnection(dbConn); 
      } 
     } catch (SQLException e) { 
      Logger.log(Logger.Debug, 
        "Error whilst getting Payment record" + e, "hello"); 
     } 
    } 
    return crs; 
} 

Примечание: Это не лучшая практика для обработки как извлечения результатов и обновления в том же методе, а попытаться разделить их на два отдельных & небольших методов, так что код может лучше ремонтопригодны/читаемыми.

+0

У вас есть предложение для фрагмента кода. rs = (ResultSet) callableStatement.getObject (1); crs = new CachedRowSetImpl(); crs.populate (rs); – user3647134

+0

Что вы подразумеваете под любым предложением? Я не получил это – developer

+0

у нас есть альтернативный способ сделать это? – user3647134

Смежные вопросы