返されるデータベースエラー
DML ステートメントでは、処理されているいずれかのレコードの操作に失敗すると、必ず例外が返されてすべてのレコードの操作がロールバックされますが、Database クラスメソッドの場合、同様の動作を行うことも、レコード処理の一部の成功を許可することもできます。後者 (部分処理) の場合、Database クラスメソッドで例外は発生しません。代わりに、失敗したレコードで発生したエラーのリストが返されます。
エラーは Database クラスメソッドの結果に含まれており、このエラーにより失敗の詳細がわかります。たとえば、挿入操作や更新操作の場合は SaveResult オブジェクトが返されます。返されるすべての結果と同様に、SaveResult には、発生したエラー (ある場合) を表す Database.Error オブジェクトのリストを返す getErrors と呼ばれるメソッドが含まれています。
例
この例では、Database.insert 操作で返されるエラーを取得する方法を示します。2 つの取引先が挿入されていますが、一方には必要な Name 項目がなく、第 2 パラメーターが false: Database.insert(accts, false); に設定されています。ここでは、部分処理オプションが設定されています。次に、if (!sr.isSuccess()) を使用してコールが失敗していないかどうかがチェックされ、エラーが反復処理されてエラー情報がデバッグログに書き込まれます。
1// Create two accounts, one of which is missing a required field
2Account[] accts = new List<Account>{
3 new Account(Name='Account1'),
4 new Account()};
5Database.SaveResult[] srList = Database.insert(accts, false);
6
7// Iterate through each returned result
8for (Database.SaveResult sr : srList) {
9 if (!sr.isSuccess()) {
10 // Operation failed, so get all errors
11 for(Database.Error err : sr.getErrors()) {
12 System.debug('The following error has occurred.');
13 System.debug(err.getStatusCode() + ': ' + err.getMessage());
14 System.debug('Fields that affected this error: ' + err.getFields());
15 }
16 }
17}