blog
ブログ

使い方を間違うと大変。1DMLで複数オブジェクトInsertする方法

DML

あけましておめでとうございます。

本年も当社および技術ブログをよろしくお願いいたします!

 

久しぶりの技術ブログ更新となりましたが、今回は、DML文に関するガバナ制限

回避方法の一つをご紹介します。

DMLのガバナ制限とは?

 

ガバナ制限上、1トランザクションでの実行できるDML文の上限は150(Winter’15時点)と

なっており、150を超える処理を行う必要がある場合、制限の回避に苦労します。

 

そういった場合に、1DMLで10オブジェクトまで一括でInsertする方法を

利用することで、DML数を減らすことが可能となることがあります。

 

 

1DMLで複数オブジェクトInsertする方法

 

 下記のソースのように記述することで、1DMLでInsertが可能となります。

但し、1度にInsertできるオブジェクトは10種類までとなります。

10種類以上Insertするとエラーとなりますので、10種類で区切るような処理を

入れるようにしてください。
※エラーメッセージは、添付画像の通りとなります。

1DM10オブジェクト超エラー

 

なお、下記ソースは、10オブジェクト以上でもInsert可能な、サンプルコードと

なります。

List<Sobject> sobjList = new List<Sobject>();

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レコードのガバナ制限については、

この記述により回避できませんので、別途気を付ける必要はあります。

 

contact

ご相談・ご質問等ございましたら、お気軽にお問い合わせください。

翻訳

SFA/CRMに蓄積されている情報を活用する方法ガイド