この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

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 ステートメントに類似する、発生した例外をサポートする構文も含まれます。

この 2 つの方法ではほとんどの操作が重複していますが、次の点は異なります。

  • convertLead は Database クラスメソッドでのみ使用でき、DML ステートメントでは使用できません。
  • Database クラスには、メソッドのトランザクションの制御とロールバック、ごみ箱を空にする、SOQL クエリに関連するメソッドなど、DML ステートメントでは使用できないメソッドも備えられています。

メモ