You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Apex类中调用批处理实现超1万条数据的DML操作?

解决Apex中DML行数超限问题:直接调用批处理完成大量数据的Insert/Update

一、编写批处理类(实现Database.Batchable接口)

批处理类会自动将大数据集拆分为多个批次执行,每批次DML行数不超过上限(默认200,最大可设2000),从而避开Too many DML rows: 10001错误。根据数据来源不同,分两种场景实现:

场景1:处理数据库查询的数据(Update操作)

如果要处理的数据来自SOQL查询,用QueryLocator定义数据范围:

public class LargeDataUpdateBatch implements Database.Batchable<SObject> {

    // 定义要处理的数据范围
    public Database.QueryLocator start(Database.BatchableContext bc) {
        // 替换为你的目标查询,比如筛选需要更新的记录
        return Database.getQueryLocator([SELECT Id, Description FROM Contact WHERE Email != null]);
    }

    // 处理每一批数据的DML操作
    public void execute(Database.BatchableContext bc, List<SObject> scope) {
        for(SObject obj : scope) {
            Contact con = (Contact)obj;
            con.Description = 'Updated on ' + System.now();
        }
        // 每批仅处理当前scope内的数据,不会触发行数超限
        update scope;
    }

    // 批处理完成后的收尾操作(可选)
    public void finish(Database.BatchableContext bc) {
        System.debug('批量更新执行完成');
    }
}

场景2:处理内存中的数据集(Insert操作)

如果数据是在内存中生成的(比如外部接口返回、批量构造的对象),通过构造方法传入数据集,用Iterable<SObject>返回:

public class LargeDataInsertBatch implements Database.Batchable<SObject> {

    private List<SObject> targetData;

    // 构造方法接收要插入的数据集
    public LargeDataInsertBatch(List<SObject> dataList) {
        this.targetData = dataList;
    }

    public Iterable<SObject> start(Database.BatchableContext bc) {
        return targetData;
    }

    public void execute(Database.BatchableContext bc, List<SObject> scope) {
        insert scope;
    }

    public void finish(Database.BatchableContext bc) {
        System.debug('批量插入执行完成');
    }
}

二、在目标Apex类中直接调用批处理

无需调度,直接在业务类中实例化批处理类,调用Database.executeBatch()触发执行:

调用查询型批处理(Update场景)

public class BusinessService {
    public static void runLargeUpdate() {
        LargeDataUpdateBatch updateBatch = new LargeDataUpdateBatch();
        // 可选指定批大小(最大2000),不指定则用默认200
        Database.executeBatch(updateBatch, 2000);
    }
}

调用内存数据批处理(Insert场景)

public class DataGenerationService {
    public static void generateAndInsertLargeData() {
        List<Account> accountList = new List<Account>();
        // 构造15000条测试数据(超过10000行限制)
        for(Integer i = 0; i < 15000; i++) {
            accountList.add(new Account(Name='Demo Account ' + i));
        }

        LargeDataInsertBatch insertBatch = new LargeDataInsertBatch(accountList);
        Database.executeBatch(insertBatch, 2000);
    }
}

三、关键注意事项

  • 批处理调用限制:同步Apex中最多调用5次Database.executeBatch(),异步环境最多25次;若需处理极大量数据,可在finish()方法中链式触发下一批处理。
  • 批大小设置:最大可设为2000,根据业务逻辑调整(比如复杂逻辑用较小批大小避免CPU超时)。
  • 测试覆盖:编写测试类时,需用Test.startTest()和Test.stopTest()包裹批处理调用,确保批处理逻辑被执行并验证结果。

内容的提问来源于stack exchange,提问作者hinako

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:37:42