2021年3月19日金曜日

RESTデータ・ソースを使った高度な同期化(3) - コードによる同期化

 こちらの記事の継続です。リモートにある表EMPとローカルの表LOCAL_CHILD_TABLEを、コードによって同期します。APEX_REST_SOURCE_SYNC.DYNAMIC_SYCHRONIZE_DATAを使用します。

このAPIはSQLコマンドから呼び出すことはできないため、作成しているアプリケーションにプロセスを作成し、動作の確認を行います。

表LOCAL_CHILD_TABLEの内容の確認と操作ができるように、対話グリッドのリージョンを追加します。

ページ・デザイナでホーム・ページ(ページ番号1)を開き、Content Body以下でリージョンの作成を実行します。タイトルをLOCAL_CHILD_TABLEタイプ対話グリッドに設定します。表名LOCAL_CHILD_TABLEを選択し、ROWID列を含めるONにします。対話グリッドを編集可能にするために列EMPNOを主キー列と設定してもよいのですが、そうすると列EMPNOが非表示になります。今回の用途ではROWID列が扱いやすいので、こちらを利用します。


右ペインのプロパティ・エディタにてAttributesタブを開いて、編集有効にします。


ページ・プロセスを呼び出すボタンを配置するリージョンの作成を行います。名前同期処理とし、タイプ静的コンテンツを指定します。


そこに、部門番号DEPTNOを入力するページ・アイテムとしてP1_DEPTNOを作成します。ラベル部門番号とします。


作成したページを実行して、出来上がりを確認します。


アプリケーション・ビルダーに戻り、表EMPにアクセスするRESTデータ・ソースの静的IDを確認します。静的IDは名前と同じ、Childであることが確認できます。


指定した部門番号のデータを選択して、同期する処理を組み込みます。以下のコードを使います。

declare
l_parameters apex_exec.t_parameters;
begin
apex_exec.add_parameter(
p_parameters => l_parameters,
p_name => 'deptno',
p_value => :P1_DEPTNO );

apex_rest_source_sync.dynamic_synchronize_data(
p_module_static_id => 'Child',
p_sync_static_id => 'dynamic "deptno" value',
p_sync_parameters => l_parameters );
end;

ボタンの作成を行いボタン名B_SYNC_DEPTとします。ラベル部門で同期とし、アクションはデフォルトのページの送信のままとします。


左ペインでプロセス・ビューを開き、プロセスの作成を行います。名前部門で同期とし、ソースPL/SQLコードを設定します。サーバー側の条件として、ボタン押下時B_SYNC_DEPTを選択します。


これで同期処理の実装ができたので、ページを実行して動作を確認します。

対話グリッドからデータの削除や更新を行った後に、部門で同期を実行するとリモートの表EMPの内容で上書きされることが確認できます。


部門単位で同期できることは確認できたので、次に表LOCAL_PARENT_TABLE(リモートでの表DEPT)に含まれる全部門を対象に更新処理を行います。

declare
l_parameters apex_exec.t_parameters;
begin
for d in (
select deptno
from local_parent_table )
loop
l_parameters.delete;
apex_exec.add_parameter(
p_parameters => l_parameters,
p_name => 'deptno',
p_value => to_char( d.deptno ) );

apex_rest_source_sync.dynamic_synchronize_data(
p_module_static_id => 'Child',
p_sync_static_id => 'Dynamic Deptno',
p_sync_parameters => l_parameters );
end loop;
end;

ボタンの作成を行い、ボタン名B_SYNC_ALLとします。ラベル全部門同期動作アクションページの送信です。


実際に処理を行うプロセスの作成を行います。名前全部門同期とし、PL/SQLコードを設定し、サーバー側の条件ボタン押下時B_SYNC_ALLとします。


ページを実行し、動作を確認します。対話グリッドを操作し、全行削除した後、全部門同期をクリックします。リモートにある表EMPの内容がすべて同期されることが確認できます。


これでリモート表EMPとローカル表LOCAL_CHILD_TABLEの同期処理を一度に実施できるようになりました。

元記事ではこれから、親表つまりLOCAL_PARENT_TABLEを同期した後、表LOCAL_CHILD_TABLEを同期する方法を実装しています。RESTデータ・ソースの同期化は、それぞれのRESTデータ・ソース自体の設定であるため、複数のRESTデータ・ソースを一度に同期させることはできません。

次の記事は、自動化による同期処理を実装してみます。