こちらの記事の継続です。REST APIが作成されたので、これからはAPEXに移って、RESTデータ・ソースの定義と同期化設定を行います。
最初に空のアプリケーションを作成します。アプリケーション作成ウィザードを起動し、アプリケーションの名前をREST同期とし、アプリケーションの作成を実行します。
アプリケーションが作成されたら、共有コンポーネントのRESTデータ・ソースを開きます。親となる表DEPTを指すRESTデータ・ソースと、子となる表EMPを指すRESTデータ・ソースの2つを作成します。
RESTデータ・ソースの一覧より、作成を実行します。
最初に作成するのは表DEPTのRESTデータ・ソースです。
RESTデータ・ソースの作成は最初からを選択し、次に進みます。
RESTデータ・ソース・タイプはOracle REST Data Servicesを選択し、名前はParent、URLエンドポイントは表DEPTの行を返すURL(末尾が/dept/で終わるURL)を設定します。次に進みます。
検出されたベースURLとサービスURLパスの値を確認し、次へ進みます。
認証は設定していないので、認証が必要ですはOFFにし、検出をクリックします。
検出されたデータLoc, Dname, Deptnoを確認して、RESTデータ・ソースの作成を実行します。
RESTデータ・ソースが作成されました。続いて、表EMPのRESTデータ・ソースを定義します。表DEPTの時と同じ操作を行います。
パラメータの追加を行います。(GET操作に限定してパラメータの追加を行う方法については、追記を参照してください。)
パラメータのタイプを問合わせ文字列変数、名前をdeptnoとします。値は10、目的は入力で、静的はOFFです。静的がOFFなので、値として指定された10は、呼び出し時に変更することができます。値が空の場合に省略はONとします。
パラメータが追加されたことを確認します。
RESTデータ・ソースの準備は以上で完了です。
続いて、同期化の設定を行います。最初は表DEPTを同期化します。RESTデータ・ソースのParentを開きます。RESTデータ・ソースの検出時には、どの列が主キーであるか分かりません。そのため、列DEPTNOを主キーに指定します。
データ・プロファイルの編集を開きます。
列DEPTNOを編集するため、鉛筆アイコンをクリックします。
主キーをONにし、変更の適用を行います。
同期先を新規表とし、その表名として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が作成され、同期化の準備が完了します。列EMPNOを主キーに設定済みなので、同期タイプはマージを選びます。元記事とは違い、deptnoを問合せ文字列として設定しているので、無指定で同期化を行うと表EMPの全件が同期化の対象となり、全行コピーされます。
元記事と同じようにDEPTNOごとに同期化処理が行われるよう、ステップを定義します。ステップの追加をクリックします。
保存して実行を行い、結果を確認します。
SQLワークショップのオブジェクト・ブラウザより、表LOCAL_CHILD_TABLEのデータを参照します。
DEPTNOが10の行のみ、同期されていることが確認できます。
続いてDEPTNOが20の行を同期するよう、ステップを追加します。ステップでパラメータ名deptnoの式は、パラメータのデフォルト値が割り当たるため、ステップを定義する前にデフォルト値を変更します。パラメータdeptnoの鉛筆アイコンをクリックします。
デフォルト値を変更した後、同期化の管理を開きステップの追加を実行します。式として20が設定されていることを確認します。静的IDをDEPTNO 20として、変更の適用をクリックします。
保存して実行を行い、結果を確認します。
DEPTNOが10と20の行を確認することができます。
この作業を存在するDEPTNOの数だけ行うことで、対象となるすべての行の同期化を行うことができます。
しかし、事前にどれだけの部門 - DEPTNOが存在するのか判明していないとステップを追加できないし、さらには、新規に部門が追加されると、その部門に対応したステップも追加する必要があります。
Oracle APEXが提供しているパッケージAPEX_REST_SOURCE_SYNCを使うことにより、そのような要件に対応しよう、というのが次の記事になります。
追記
問合せ文字列変数deptnoの設定をGET操作に限定するときは、操作にパラメータを追加します。今回の例では、操作のGETを開きます。
それぞれのRESTソース操作に対して、パラメータの追加を行うことができます。
今回の例では、POST、PUT、DELETEといった操作でdeptno指定が必要とは考えられないので、GET操作に限定してパラメータdeptnoを追加した方が良かったと思います。
追記2