DML ステートメントと Database クラスメソッド
Apex には、DML 操作の実行方法として、DML ステートメントを使用する方法と Database クラスメソッドを使用する方法の 2 通りがあります。このため、データ操作の実行方法が柔軟になります。DML ステートメントは使いやすいため例外が発生しますが、コード内で処理することができます。
次は、新しいレコードを挿入するための DML ステートメントの例です。
1// Create the list of sObjects to insert
2List<Account> acctList = new List<Account>();
3acctList.add(new Account(Name='Acme1'));
4acctList.add(new Account(Name='Acme2'));
5
6// DML statement
7insert acctList;次は、上記と同等の例ですが、DML 動詞ではなく、データベースクラスのメソッドを使用します。
1// Create the list of sObjects to insert
2List<Account> acctList = new List<Account>();
3acctList.add(new Account(Name='Acme1'));
4acctList.add(new Account(Name='Acme2'));
5
6// DML statement
7Database.SaveResult[] srList = Database.insert(acctList, false);
8
9// Iterate through each returned result
10for (Database.SaveResult sr : srList) {
11 if (sr.isSuccess()) {
12 // Operation was successful, so get the ID of the record that was processed
13 System.debug('Successfully inserted account. Account ID: ' + sr.getId());
14 }
15 else {
16 // Operation failed, so get all errors
17 for(Database.Error err : sr.getErrors()) {
18 System.debug('The following error has occurred.');
19 System.debug(err.getStatusCode() + ': ' + err.getMessage());
20 System.debug('Account fields that affected this error: ' + err.getFields());
21 }
22 }
23}上記 2 例の違いは、データベースクラスメソッドを使用すると、エラーが発生した場合に部分的なレコード処理を許可するかどうかを指定できる点です。これは、2 番目の追加の Boolean 値パラメータを渡すことで行えます。このパラメータを false に設定すると、レコードが失敗しても、残りの DML 操作は正常に完了できます。また、例外が返されるのではなく、各操作と発生したすべてのエラーの状況を含む���果オブジェクト配列 (または 1 つの sObject しか渡されなかった場合は 1 つの結果オブジェクト)が返されます。デフォルトで、このパラメータ (省略可能) は true です。つまり、少なくとも 1 つの sObject を処理できない場合、残りのすべての sObject も処理されず、失敗の原因となったレコードに対して例外が返されます。
DML ステートメントと Database クラスメソッドのどちらを使用するかを決めるには、次の点を参考にしてください。
- DML 一括処理中に発生するエラーを、コントロールフローをその場で中断する Apex 例外として処理する場合、DML ステートメントを使用します。ここでは try. . .catch ブロックを使用します。この動作は、ほとんどのデータベース手続き型言語での例外の処理方法に似ています。
- DML 一括操作の部分的な完了を可能にする場合は、Database クラスメソッドを使用します。レコードが失敗した場合でも、DML 操作の残りは終了できます。アプリケーションは拒否されたレコードを確認でき、可能であれば操作を再試行します。この形式を使用すると、DML 例外エラーが発生することがないコードを書くことができます。エラーが発生しない代わりに、作成したコードでは、成功または失敗を判断するための適切な結果配列を使用できます。Database クラスメソッドには、DML ステートメントに類似する、発生した例外をサポートする構文も含まれます。