I'm dealing with the CampaignMember standard object, and a custom object called Binding__c. I need to create a new Binding__c record for each CampaignMember record, and there might be 25K of those -- so I'm setting up Batch Apex to handle it.

The initial query in the start() method will be on the CampaignMember object.

The execute method will create a new Binding__c record with the CampaignMemberId, then insert the record.

My question is, in the class declaration, do I use the SObject I'm querying and iterating through, or the SObject I'm creating and inserting?

global class BindingBatchCreate implements Database.Batchable<CampaignMember> {


global class BindingBatchCreate implements Database.Batchable<Binding__c> {

I think it should be the CampaignMember, as this is what I'm iterating.

For the corresponding BindingBatchUpdate and BindingBatchDelete, I'll be iterating the Binding__c, so that's obvious.

2 Answers 2


You iterate over the object returned by your query. If you have a QueryLocator which iterates CampaignMember, you build a Database.Batchable<CampaignMember>.


It would be records(Iterable) or query-locator for sObject you are returning from start method. In you case it will implements Database.Batchable<CampaignMember> {

Or if you wanna go more generic go with

implements Database.Batchable<sObject> {

Src: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_batch_interface.htm

  • thanks. I'm on that doc page. I confused myself because for my other two batch classes (to update and delete the Binding__c) the iterable is Binding__c. Feb 18, 2019 at 18:01

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .