こちらの記事の継続です。リモートにある表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列が扱いやすいので、こちらを利用します。
ページ・プロセスを呼び出すボタンを配置するリージョンの作成を行います。名前を同期処理とし、タイプは静的コンテンツを指定します。
そこに、部門番号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データ・ソースを一度に同期させることはできません。
次の記事は、自動化による同期処理を実装してみます。