Обработка данных пакетами

Обработка данных пакетами#

Показывает подход для массового изменения большого объёма данных, когда обработка всех записей за один проход может привести к переполнению памяти. Записи выбираются и обрабатываются пачками, после каждой пачки выполняется commit().

Место применения: Сервис > Инструменты > Выполнить JEXL-скрипт

Внимание

Перед использованием замените SQL-запрос, размер пачки и логику обработки на значения, подходящие для вашей задачи.

Тип: JEXL-скрипт

// Обработка данных по пачкам
var batchSize = 200;
var nCount = 0;
var nOffset = 0;

var sqlText = `
<запрос>
`;

while (true) {
  // offset не нужен, если после каждой пачки отдается commit в БД
  // и запрос исключает уже обработанные записи
  var listSQL = sql(sqlText + " offset " + nOffset + " limit " + batchSize).asList();
  
  // Условие выхода из цикла
  if (listSQL.isEmpty()) {
    break;
  }
  
  for (data : listSQL) {
    var ropPlacement = Bs_PlacementApi.load(data.id);
    Bs_PlacementApi.setObjAttrValue(ropPlacement, "idMonitorTrainLocationType", data.idtype);
    nCount += 1;
  }
  
  commit();
  nOffset += batchSize;
}

// Результат
if (nCount == 0) {
  dialogs.showMessage("Исправлять нечего.");
} else {
  dialogs.showMessage("Исправлено " + nCount + " записей.");
}