ノーコードでクラウド上のデータとの連携を実現。
詳細はこちら →CData Arc - Salesforce へのUpsert をバッチで実行する方法
色川穂高
CData Arc のUpsert 機能

CData Salesforce Driver でのUpsert

CData Arc でのバッチ処理(Insert/Update)
- CData Arc のコネクタレベルで提供されるUpsert 機能(Select した結果でInsert かUpdate を自動で判断・実行する機能)は連携フローの作成において非常に便利ですが、複数レコードを一括処理することはできません。一定量のデータを処理する必要がある時や、API コール数をシビアにコントロールしたい場合は、複数レコードを一括処理する機構を利用したくなると思います。
- Salesforce ではAPI としてUpsert が用意されており、CData Salesforce Driver ではUpsert API に対応しています。CData Salesforce Driver ではInsert/Update だけでなくUpsert においても複数レコードを一括処理するバッチの機構に対応しています。同期SOAP API だけでなく非同期Bulk API も利用可能です。
- CData Arc は(CData Drivers が対応していれば)Insert やUpdate において複数レコードを一括処理するバッチの機構を、バッチインプットサイズを指定することで簡単に利用することができます。ただしUpsert はこの方法が使えません。
CData Arc で、Salesforce へのUpsert をバッチで実行する方法
少し長い前フリになりましたが、ここからこの記事の本題です。
CData Arc のSalesforce コネクタは、CData Salesforce Driver を便利な機能とUI を付けてラップしたコネクタです。CData Salesforce Driver が持つ機能価値はCData Arc でも利用することができます。
Salesforce へのUpsert をバッチで実行する(複数レコードを一括Upsert する)場合は、以下の流れのように設定してください。
基本的な考え方
考え方としては「CData Salesforce Driver 側が備える複数レコードを一括処理するためのSQL 構文(一時テーブルを利用する機構)」を「CData Arc のSalesforce コネクタでカスタムマッピングとして指定する」ことで実現します。
具体的には「一時テーブル(#TEMP)へのInsert、一時テーブルをソースとしたUpsert Into Select、2つのクエリを実行」する必要がありますが、これを「CData Arc のSalesforce コネクタが備えるPre-Processing and Post-Processing Queries」の機構を利用して実現します。
対象オブジェクトの構成

Salesforce コネクタの設定


<Items> <Product2 table="Product2" insertQuery="INSERT INTO Product2#TEMP (Name, ProductCode, External_key__c, ExternalIdColumn) VALUES (@Name, @ProductCode, @External_key__c, 'External_key__c')"> <Name /> <ProductCode /> <External_key__c /> <ExternalIdColumn /> </Product2> <UPSERTProduct2 table="Product2" insertQuery="UPSERT INTO Product2 (Name, ProductCode, External_key__c, ExternalIdColumn) SELECT Name, ProductCode, External_key__c, ExternalIdColumn FROM Product2#TEMP" requireInput="false"> </UPSERTProduct2> </Items>


おわりに