2021年1月22日金曜日

リモート・データへのアクセス (4) - 同期化の管理

こちらの記事の継続になります。RESTデータ・ソースの同期化の設定を行ってみましょう。

同期化の管理


すでに作成済みのRESTデータ・ソースの定義を開きます。RESTソース名をクリックします。


右側に同期化の管理というリンクがあります。これをクリックして開きます。


最初は同期化が構成されていませんと表示されます。


同期先新規表表名EMP_LOCALとして、データ同期化を構成します。作成をクリックします。


新規表を指定しているので、表が存在しません、という状態になります。いきなり表の作成をクリックすることもできますが、SQLの表示を行ってみましょう。


表の作成/変更SQLの領域が開きます。SQLを確認してから、表の作成を実行しましょう。


今回生成されているSQLは以下のようになっています。
/*
-- このAPIコールは、ALTER TABLE文を実行することで、
-- 表の列をRESTデータ・ソースのデータ・プロファイルに動的に同期化します。
-- ALTER TABLEを使用して列のデータ型を変更できない場合、
-- エラー・メッセージが生成されます。
--
begin
    apex_rest_source_sync.synchronize_table_definition(
        p_application_id      => apex_application_install.get_application_id,
        p_module_static_id    => 'EMP_in_Ashburn',
        p_drop_unused_columns => false );
end;
/
*/

create table "EMP_LOCAL"(
    "EMPNO"                     NUMBER
   ,"ENAME"                     VARCHAR2(4000)
   ,"JOB"                       VARCHAR2(4000)
   ,"MGR"                       NUMBER
   ,"HIREDATE"                  DATE
   ,"SAL"                       NUMBER
   ,"COMM"                      NUMBER
   ,"DEPTNO"                    NUMBER
   ,"APEX$SYNC_STEP_STATIC_ID"  VARCHAR2(255)
   ,"APEX$ROW_SYNC_TIMESTAMP"   TIMESTAMP WITH TIME ZONE
   ,constraint "EMP_LOCAL_PK" primary key ("EMPNO"))
/

コメント・アウトされている部分は既存表を選んだ際に呼び出されるプロシージャ・コールです。リモートの表の定義とローカルの表の定義を厳密に一致させたい場合は、あらかじめ表を作成しておく方が望ましいでしょう。また、同期化に使用される表にはAPEX$SYNC_STEP_STATIC_IDおよびAPEX$ROW_SYNC_TIMESTAMPの2つの列が追加されます。これらの列は、既存表を選んだ際にも、選んだ既存表に追加されます。

表の作成が行われると、同期化の準備ができています、という表のステータスに変わります。ここで保存して実行を行うと、リモートに存在する表EMPの内容がローカルの表EMP_LOCALにコピーされます。

同期タイプには追加マージ置換の3種類があります。同期スケジュールを設定することにより、定期的に同期処理を実行するようになります。動作の違いについては、オンライン・ヘルプに以下の記載があります。

  • 追加: ローカル表に行を追加します。これは、通常、主キーがデータ・プロファイルに定義されていない場合に使用されます。
  • マージ: ローカル表に行をマージします。このオプションを使用するには、データ・プロファイルに主キーが定義されている必要があります。指定した主キー値の行が存在する場合は行が更新され、それ以外の場合は行が作成されます。
  • 置換: 新しいデータをロードする前にローカル表を空にします。
同期スケジュールの設定には間隔ビルダーを使うことができます。文字列による実行間隔の指定は大変難しいので、とても助かります。

文字列による指定の例: FREQ=WEEKLY;INTERVAL=1;BYDAY=MON,TUE,THU,FRI,SAT,SUN;BYHOUR=7;BYMINUTE=20;BYSECOND=0


その他にも調整可能な設定がいくつもありますが、今回は単純に同期タイプ追加のままで、一度だけ同期化を行います。保存して実行をクリックします。


ジョブのステータスがスケジュール済となり、矢印はクルクル回り続けます。同期スケジュールの設定、つまり定期実行が前提であることが理由だと思いますが、データのコピーが終了していてもそのままなので、適当な頃合いで同期化の中断をクリックします。


処理を中断すると、実行結果がログにリストされます。


ステータスが成功であることを確認し、詳細の虫眼鏡をクリックして処理内容を確認します。


発行されたHTTPリクエストを確認することができます。

以上で同期化の設定が完了しました。

対話グリッドで同期化表を使用する


RESTデータ・ソースをソースとして設定した対話グリッドのページを開きます。ソースの属性に同期化表の使用が追加されているので、これをONに変更します。この変更により対話グリッドが表EMP_LOCALをアクセスするようになります。変更したページを実行し、動作を確認します。


対話グリッドに一行挿入してみます。行の追加をクリックし、それぞれの列に値を指定した後、保存をクリックします。


変更が保存されました、とメッセージが表示されます。しかし、挿入したはずの行は無くなっています。


最初に作成したREST対応SQLをソースとしている対話グリッドのページを開いて、リモートのデータを確認します。挿入されたデータが存在していることが確認できます。


ローカルに作成した同期化表の更新は、リモート表にたいして実施されることが確認できました。

以上より、RESTデータ・ソースの同期化の用途としては、マスター表のような変更が稀な表を対象とした機能であり、トランザクション表のような頻繁に更新される表の複製を作ることを目的としていないことがわかります。

以上でリモート・データへのアクセスについての記事は完了です。Oracle APEXによるアプリケーション開発の一助になれば幸いです。