こんにちは。CData Software Japan の杉本です。
CData Arcで空(長さ0の文字列、"")やNullの値が含まれるデータを取り扱うときに、シナリオによっては追加の設定が必要になるケースがあります。本記事ではそのような場合を想定して、CData Arcで空やNullのデータを扱う際のポイントを解説したいと思います。
デフォルトの挙動について
まず初めにCData Arc空やNullの値が含まれるデータを取り扱う場合のデフォルトの動作について解説します。
CData Arcではデータに空やNullのデータが存在する場合、デフォルトでは空やNullのデータを扱いません。例えば以下のようにkintoneのデータをMySQLへ登録するフローを想定します。
その際にkintone側に以下のようなデータを存在するとします。こちらのデータをMySQLに登録しようとすると、memoやdateの項目は空となるため扱われません。
より具体的には連携先であるMySQLへ発行されるInsertクエリは以下のようになり、空の項目であるmemoやdateはクエリ内では扱われていません。
INSERT INTO `test` (`id`, `product_code`, `product_name`) VALUES ('1', '001', 'test product');
この振る舞いは空やNullのデータが含まれることで発生するエラーを回避出来る、空やNullのデータを扱わないことでパフォーマンスの向上といったメリットがあります。ただし空やNull の値も更新したい、というケースにはフィットしないため、そういったシナリオでご検討されている場合は、ぜひこの記事を参考にしてください。
空やNullのデータを扱う場合
空とNullのデータを明示的に扱いたい場合は、データを登録するMySQLコネクタの高度な設定に「insertempty=true;insertnull=true;」と設定する必要があります。
※空のデータだけを扱いたい場合は「insertempty=true;」と設定します。
「insertempty=true;insertnull=true;」の設定を行うことで空とNullのデータを扱うようにすることが出来ます。具体的にはMySQLへ発行されるInsertクエリは以下のようになります。
※日付型に空のデータを登録しようとするとエラーになるため、一時的にdate項目を登録の対象から外しています。
INSERT INTO `test` (`id`, `memo`, `product_code`, `product_name`) VALUES (1 , '' , '001' , 'test product' );
空のデータをNullとして扱う場合
一つ前の例ではエラーを回避するために、一時的にdateの項目を登録の対象から外しましたが、空のデータをNullとして扱うようにすることでdateの項目を連携することも可能です。
具体的にはXMLMapコネクタから式を選択します。
式エディタから「空をnullとして扱う」にチェックを入れます。
こちらの設定を行うことで、具体的には以下のようなクエリが発行されるようになります。
INSERT INTO `test` (`id`, `date`, `memo`, `product_code`, `product_name`) VALUES (1 , NULL , '' , '001' , 'test product' );
バッチ処理での注意点
発展的な内容としてCData Arcでバッチ処理を行う場合の空やNullのデータの注意点を説明します。まずCData Arcでバッチ処理を実行する方法は以下のブログ記事をご参照ください。
CData Arc - Salesforce へのUpsert をバッチで実行する方法
CData Arc - kintone への登録や更新をバッチで実行する方法
CData Arcのバッチ処理の仕組みとしては「同じスタイルのリクエストを一時テーブルにまとめて処理して、一括でリクエストする」事で実現しているイメージです。より具体的には実際に発行されるクエリは以下のようになります。
INSERT INTO `test` (`id`, `date`, `memo`, `product_code`, `product_name`) SELECT `id`, `date`, `memo`, `product_code`, `product_name` FROM test@INSERT#TEMP
ここで注意が必要なのはデフォルト設定だと連携対象の項目に空やNullの値が含まれていた時に、バッチ処理が意図しないところで分割されてしまうということです。例えば上記のクエリを例にすると、memo項目に空のデータが含まれるとInsert文の項目に含まれなくなるため、結果として別々のInsertとして処理される動きになります。
そのためリクエスト数を軽減する目的でバッチ処理を利用している場合は、バッチ処理が意図しないところで分割されてしまい、リクエスト数が想定よりも減らない可能性があります。そのような場合は「insertempty=true;insertnull=true;」と設定頂き、クエリの中で空やNullのデータを明示的に扱っていただくことをご検討いただく必要がございます。
おわりに
今回はCData Arcによる空やNullのデータを扱う際のポイントについて解説しました。
CData Arc はシンプルで拡張性の高いコアフレームワークに、豊富なMFT・EDI・エンタープライズコネクタを備えたパワフルな製品です。CData Drivers との組み合わせで270を超えるアプリケーションへの連携を実現できます。
皆さんのつなぎたいシナリオでぜひ CData Arc を試してみてください。
CData Arc - セキュアなデータ連携とマネージドファイル転送(MFT)
この記事では CData Arc™ 2024 - 24.2.9039.0 を利用しています。
関連コンテンツ