普通に知らなかったので備忘録として…。

BatchableなInterfaceを実装するApex Batchですがexecuteに入ってくるレコードは実在するSObjectじゃなくても良いし、そもそもSObjectである必要もなく、プリミティブやカスタムなApexClassも入れられちゃいます。

つまり、startの戻り値はDatabase.QueryLocatorではなくSytem.InterableなものもOK、ということです。(リファレンスに思いっきりstartメソッドが2つ定義されています)

ということでこんな感じなApex Batchでも全く問題ない、ということです。

今まで既存レコードでしか利用できないと思っていました…とは言えQueryLocatorを使った既存レコードでの利用が8割以上な気がしますが。

利用ケースとしては

  • レコードとして残さないけど、ガバナを要因として1トランザクション内で収まらない処理(コールアウトとかメール送信とか)
  • 1トランザクションでのDML発行量のガバナを考慮してバッチで処理を分割したい

という感じですかね。「1トランザクション内におけるガバナ回避」という用途で「レコードを残さない(残せない)」ケースでの利用になると思われます。