2021年3月18日木曜日

RESTデータ・ソースを使った高度な同期化(2) - 宣言による同期化

 こちらの記事の継続です。REST APIが作成されたので、これからはAPEXに移って、RESTデータ・ソースの定義と同期化設定を行います。

最初に空のアプリケーションを作成します。アプリケーション作成ウィザードを起動し、アプリケーションの名前REST同期とし、アプリケーションの作成を実行します。

アプリケーションが作成されたら、共有コンポーネントRESTデータ・ソースを開きます。親となる表DEPTを指すRESTデータ・ソースと、子となる表EMPを指すRESTデータ・ソースの2つを作成します。

RESTデータ・ソースの一覧より、作成を実行します。

最初に作成するのは表DEPTのRESTデータ・ソースです。

RESTデータ・ソースの作成最初からを選択し、に進みます。

RESTデータ・ソース・タイプOracle REST Data Servicesを選択し、名前ParentURLエンドポイントは表DEPTの行を返すURL(末尾が/dept/で終わるURL)を設定します。に進みます。

検出されたベースURLサービスURLパスの値を確認し、へ進みます。

認証は設定していないので、認証が必要ですOFFにし、検出をクリックします。

検出されたデータLoc, Dname, Deptnoを確認して、RESTデータ・ソースの作成を実行します。

RESTデータ・ソースが作成されました。続いて、表EMPのRESTデータ・ソースを定義します。表DEPTの時と同じ操作を行います。


元記事とまったく同じというのも面白味がないので、この記事ではURLエンドポイントemp/:deptnoではなく、emp?deptno=:deptnoにアクセスするようにします。名前Childとします。URLの一部ではなくパラメータとしてdeptnoを指定する場合は、URLエンドポイントにパラメータは含まず、empだけにします。この設定でRESTデータ・ソースの作成をします。


作成されたRESTデータ・ソースChildを開き、パラメータdeptnoを追加します。


パラメータの追加を行います。(GET操作に限定してパラメータの追加を行う方法については、追記を参照してください。)


パラメータのタイプ問合わせ文字列変数名前deptnoとします。10目的入力で、静的OFFです。静的がOFFなので、値として指定された10は、呼び出し時に変更することができます。値が空の場合に省略ONとします。


パラメータが追加されたことを確認します。


RESTデータ・ソースの準備は以上で完了です。

続いて、同期化の設定を行います。最初は表DEPTを同期化します。RESTデータ・ソースParentを開きます。RESTデータ・ソースの検出時には、どの列が主キーであるか分かりません。そのため、列DEPTNOを主キーに指定します。


データ・プロファイルの編集を開きます。


DEPTNOを編集するため、鉛筆アイコンをクリックします。


主キーONにし、変更の適用を行います。


取消をクリックして、データ・プロファイルの画面を閉じます。


同期化の管理を開きます。これからリモートに存在する表DEPTをコピーする設定を行います。


同期先新規表とし、その表名としてLOCAL_PARENT_TABLEを指定します。保存をクリックします。


データ同期化が作成されます。この時点では同期先となる表はまだ作成されていません。SQLの表示をクリックし、DDLを確認します。


CREATE TABLE文が表示されます。REST APIのレスポンスからは文字列長は不明なので、列LOC、DNAMEともに4000バイトが設定されています。同期元の表定義が分かっている場合は、そちらに合わせるように設定を変えた方がよいでしょう。今回は4000バイトのまま変更は行いません。表の作成を実行します。


表LOCAL_PARENT_TABLEが作成され、同期化の準備ができました。同期タイプとしてマージを選択し、同期スケジュールを設定します。同期タイプのマージは主キーを見てデータの存在を判断するため、RESTデータ・ソースのデータ・プロファイルに主キーとなる列の指定が必要です。今回の例では、同期スケジュールでの繰り返し実行は確認しないため、どのような期間を設定しても構いません。それぞれ設定を行ったのち、保存して実行をクリックします。同期処理が実行されます。


ジョブのステータススケジュール済に変わります。


SQLワークショップオブジェクト・ブラウザより表LOCAL_PARENT_TABLEに同期されたデータを確認します。


部門の行がコピーされていることが確認できます。

続いてRESTデータ・ソースChildの同期化設定を行います。最初に列EMPNOを主キーに指定します。データ・プロファイルの編集を開き、列EMPNO鉛筆アイコンをクリックします。


主キーONにし、変更の適用をクリックします。


同期化の管理を開き、同期先新規表表名LOCAL_CHILD_TABLEとして、保存を実行します。


表の作成を行います。


表LOCAL_CHILD_TABLEが作成され、同期化の準備が完了します。列EMPNOを主キーに設定済みなので、同期タイプマージを選びます。元記事とは違い、deptnoを問合せ文字列として設定しているので、無指定で同期化を行うと表EMPの全件が同期化の対象となり、全行コピーされます。

元記事と同じようにDEPTNOごとに同期化処理が行われるよう、ステップを定義します。ステップの追加をクリックします。


最初のステップを定義します。静的IDとしてDEPTNO 10を指定します。パラメータ名、値タイプ、式はRESTデータ・ソースのデフォルト値を参照し、ステップでは指定できません。変更の適用をクリックし、DEPTNOを10に限定して同期化を行うステップを作成します。


保存して実行を行い、結果を確認します。


SQLワークショップオブジェクト・ブラウザより、表LOCAL_CHILD_TABLEデータを参照します。


DEPTNOが10の行のみ、同期されていることが確認できます。

続いてDEPTNOが20の行を同期するよう、ステップを追加します。ステップでパラメータ名deptnoの式は、パラメータのデフォルト値が割り当たるため、ステップを定義する前にデフォルト値を変更します。パラメータdeptno鉛筆アイコンをクリックします。


を10から20に変更し、変更の適用をクリックします。


デフォルト値を変更した後、同期化の管理を開きステップの追加を実行します。式として20が設定されていることを確認します。静的IDDEPTNO 20として、変更の適用をクリックします。


保存して実行を行い、結果を確認します。


DEPTNOが10と20の行を確認することができます。


この作業を存在するDEPTNOの数だけ行うことで、対象となるすべての行の同期化を行うことができます。

しかし、事前にどれだけの部門 - DEPTNOが存在するのか判明していないとステップを追加できないし、さらには、新規に部門が追加されると、その部門に対応したステップも追加する必要があります。

Oracle APEXが提供しているパッケージAPEX_REST_SOURCE_SYNCを使うことにより、そのような要件に対応しよう、というのが次の記事になります。

 追記

問合せ文字列変数deptnoの設定をGET操作に限定するときは、操作にパラメータを追加します。今回の例では、操作GETを開きます。


それぞれのRESTソース操作に対して、パラメータの追加を行うことができます。


今回の例では、POST、PUT、DELETEといった操作でdeptno指定が必要とは考えられないので、GET操作に限定してパラメータdeptnoを追加した方が良かったと思います。

追記2

元記事にある"We could add more Synchronization Steps - and instead of hard-coding the values 10, 20, 30 we can also get them from a SQL Query, or PL/SQL function. "が何を指しているのか分かりませんでした。続く説明でコーディングによる同期方法が解説されているので、ステップの引数だけをコードで取得するようにしても、あまり意味がありません。そのため、この方法については確認していません。