使い方を間違うと大変。1DMLで複数オブジェクトInsertする方法
あけましておめでとうございます。
本年も当社および技術ブログをよろしくお願いいたします!
久しぶりの技術ブログ更新となりましたが、今回は、DML文に関するガバナ制限
回避方法の一つをご紹介します。
DMLのガバナ制限とは?
ガバナ制限上、1トランザクションでの実行できるDML文の上限は150(Winter’15時点)と
なっており、150を超える処理を行う必要がある場合、制限の回避に苦労します。
そういった場合に、1DMLで10オブジェクトまで一括でInsertする方法を
利用することで、DML数を減らすことが可能となることがあります。
1DMLで複数オブジェクトInsertする方法
下記のソースのように記述することで、1DMLでInsertが可能となります。
但し、1度にInsertできるオブジェクトは10種類までとなります。
10種類以上Insertするとエラーとなりますので、10種類で区切るような処理を
入れるようにしてください。
※エラーメッセージは、添付画像の通りとなります。
なお、下記ソースは、10オブジェクト以上でもInsert可能な、サンプルコードと
なります。
List<Sobject> insList = new List<Sobject>();
//11オブジェクト、12レコードを追加
Sobject sobj1 = new Account(Name = ‘aa’);
sobjList.add(sobj1);
Sobject sobj2 = new Account(Name = ‘bb’);
sobjList.add(sobj2);
Sobject sobj3 = new X1__c(Name = ‘bb’);
sobjList.add(sobj3);
Sobject sobj4 = new X2__c(Name = ‘bb’);
sobjList.add(sobj4);
Sobject sobj5 = new X3__c(Name = ‘bb’);
sobjList.add(sobj5);
Sobject sobj6 = new X4__c(Name = ‘bb’);
sobjList.add(sobj6);
Sobject sobj7 = new X5__c(Name = ‘bb’);
sobjList.add(sobj7);
Sobject sobj8 = new X6__c(Name = ‘bb’);
sobjList.add(sobj8);
Sobject sobj9 = new X7__c(Name = ‘bb’);
sobjList.add(sobj9);
Sobject sobj10 = new X8__c(Name = ‘bb’);
sobjList.add(sobj10);
Sobject sobj11 = new X9__c(Name = ‘bb’);
sobjList.add(sobj11);
Sobject sobj12 = new X10__c(Name = ‘bb’);
sobjList.add(sobj12);
Map<Schema.sObjectType,List<Sobject>> objMap = new Map<Schema.sObjectType,List<Sobject>>();
for (Sobject sobj : sobjList) {
Schema.SObjectType objType = sobj.getsObjectType();
if (! objMap.containsKey(objType)) {
objMap.put(objType , new List<Sobject>());
}
objMap.get(objType).add(sobj);
}
for (Schema.SObjectType sType : objMap.keySet()) {
for(Sobject obj : objMap.remove(sType)){
insList.add(obj);
}
if( insList.size() == 10 || objMap.isEmpty()){
Insert insList;
insList = new List<Sobject>();
}
}
ただし、1トランザクション中で処理可能なレコード数10,000レコードのガバナ制限については、
この記述により回避できませんので、別途気を付ける必要はあります。