まず、一括処理バッチは大量のデータを処理する際に有効です。
例えば、SOQL クエリによって取得されるレコードの合計数は50000件が上限ですが、一括処理バッチでは最大5000万件まで一度に取得することができます。
さらに、取得したレコードに対して一定数ごとにレコードを分割して処理を実行します。各処理は別トランザクションとなるため、ガバナ制限のカウントは毎回リセットされます。
したがって、一括処理バッチを用いることで大量データをガバナ制限を超過しないように処理することができるようになります。
また、一括処理バッチ使用すると非同期処理になります。したがって処理に時間がかかったとしても、ユーザはその間別の画面操作をすることができます。
以上の特徴から、大量データや、時間のかかる処理に対して力を発揮する機能だと言えます。
start() では、処理したいデータをクエリして返すようにします。返り値は Database.QueryLocator または Iterable(普通のリストの形など)のどちらかを返します。Database.QueryLocator を返すようにすると、最大5000万件まで取得することができます。
しかし、Database.QueryLocator を返す場合は、集計関数(GROUP BYなど)を使うことができません。集計関数を使いたい時はIterable を返すようにします。Iterable では通常のガバナ制限がそのまま適用されますが、このように柔軟に対応することができます。
execute() では、start() でクエリしてきたデータに対しての処理を記述します。execute() の処理はクエリしたデータを数件ごとに分割して実行されます。
public class SampleBatch implements Database.Batchable<sObject> {
global final List<Id> IdList;
// コンストラクタ
global QuoteDtlInsUpdDelItemDelete(List<id> TempIdList){
IdList=TempIdList;
}
/* Database.QueryLocator を使う場合 */
public Database.QueryLocator start(Database.BatchableContext bc) {
// レコードをクエリ
String query = 'SELECT Id, SakujyoFlag__c From Item';
return Database.getQueryLocator(query);
}
public void execute(Database.BatchableContext bc, List<P> records){
// レコードに対する処理を記述
}
public void finish(Database.BatchableContext bc){
// バッチ終了時の処理を記述
}
}
SampleBatch i = new SampleBatch(DelIdList);
Database.executeBatch(i, 1000);