2021年5月17日月曜日

RESTデータ・ソースのCSV対応

 Oracle APEX 21.1よりRESTデータ・ソースの書式としてJSON、XMLに加えてCSVが扱えるようになりました。

GitHubに配置した以下のCSVファイルを読み込むことで、利用方法を確認してみます。

https://raw.githubusercontent.com/ujnak/apexapps/master/exports/citylist.csv

内容は以下になります。

ID,PREFECTURE,CITY,COUNT
1,北海道,札幌市,100
2,宮城県,仙台市,200
3,東京都,中央区,1000
4,新潟県,新潟市,400
5,大阪府,大阪市,100
6,広島県,広島市,300
7,高知県,高知市,90
8,福岡県,福岡市,800

以前の記事を元にしていますが、参照しなくても作業は進められます。上記のCSVのデータを投入する表FDL_CITYLISTを、クイックSQLの以下のモデルから作成します。今回は表FDL_FILESは使用しません。すでに表が作成済みであれば、そのまま使用してもかまいません。

# prefix: fdl
# semantics: default
citylist
prefecture vc80
city vc80
count num

クイックSQLからアプリケーションの作成は行わず、空のアプリケーションを新規に作成します。

名前CSVデータ・ソースとしました。それ以外はそのままで、アプリケーションの作成を実行します。

アプリケーションが作成されたら、共有コンポーネントRESTデータ・ソースを開きます。

登録済みのRESTデータ・ソースの一覧画面が開きます。作成をクリックします。


RESTデータ・ソースの作成として最初からを選び、次へ進みます。


RESTデータ・ソース・タイプとして簡易HTTPを選択します。名前CSVソースとします。URLエンドポイントにテストで使うデータのURL(ここではGitHub上のCSVファイル)を指定します。へ進みます。


URLエンドポイントから導出されたリモート・サーバーベースURLおよびサービスURLパスを確認します。通常、変更は不要です。へ進みます。


認証が必要ですOFFとし、検出をクリックします。


取得されたCSVのデータが表示されます。そのままRESTデータ・ソースを作成してもよいのですが、一旦、データ・プロファイルをクリックして認識されたデータ・プロファイルを確認します。


データ・プロファイルのレスポンス・タイプとしてCSVが認識されています。先頭のヘッダー行よりセレクタや列の名前は適切に認識されていますが、ID主キーとして認識してほしいところがそうではなく、PREFECTUREおよびCITYのVARCHAR2の長さが4000になっています。CSVファイルには、そのようなメタデータは含まれていないので仕方がありません。これらは後ほど調整します。

RESTデータ・ソースの作成を実行します。


RESTデータ・ソースが作成されます。Oracle APEX 21.1より同期化タブが追加されました。


クリックして確認してみます。REST同期化の設定は行なっていないので、今のところ何もリストされません。


RESTデータ・ソースのタブに戻り、CSVソースを開きます。CSVのデータからは決定できなかった設定を修正するため、データ・プロファイルの編集を行います。


修正する対象はIDPREFECTUREおよびCITYです。それぞれ鉛筆アイコンをクリックして編集画面を開きます。


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


PREFECTURE最大長80にし、変更の適用を行います。


CITY最大長80にし、変更の適用を行います。


Oracle APEX 21.1までは列タイプとしてデータおよび導出(SQL式)のみが選択可能でした。21.1からは、データルックアップSQL式(以前の導出)およびSQL問合せ(単一の値を返す)の4種類から選択することができます。また、トランスフォーメーションも追加されました。これらの設定は、21.1にて新しくなったデータ・ロード定義と共通です。データ・プロファイルとトランスフォーメーションについては、こちらの記事で紹介しています。


ちなみに21.1以前の設定画面は以下です。セレクタ・タイプの追加(順序や正規表現)、小数点文字グループ文字の設定なども追加されています。


続けて、同期化の設定を行います。同期化の管理を開きます。なぜかapex.oracle.comでは同期化が動作しなかったため、ダウンロード版のAPEXをインストールした環境で確認しています。


これからの作業は、Oracle APEX 21.1の新機能ではなく、JSONやXMLであれば以前のバージョンでも実施可能です。

同期先として既存表を選択し、表名FDL_CITYLISTを選択します。保存をクリックします。


同期タイプとしてマージを選択し、同期スケジュールについては、動作確認を短時間で終えるために5分毎に設定しています。ジョブはアクティブですONにします。保存して実行をクリックしたときに、すぐに同期化が開始されます。

同期に使用する表の変更内容を確認するため、SQLの表示をクリックします。


表に列APEX$SYNC_STEP_STATIC_IDおよびAPEX$ROW_SYNC_TIMESTAMPが追加されることが確認できます。

alter table "FDL_CITYLIST" add (
"APEX$SYNC_STEP_STATIC_ID" VARCHAR2(255)
,"APEX$ROW_SYNC_TIMESTAMP" TIMESTAMP WITH TIME ZONE
)
/

表の変更を実行します。


保存して実行をクリックします。


保存して実行をクリックすると、その時点で同期処理が実施されます。次の同期化として表示される時刻は5分後ではなく、それ以降(以下の画面では12分後と表示)になります。


次の同期化のヘルプに以下が記載されています。
次回スケジュールされている同期化が発生する時点を示します。同期化は、正時から開始して10分ごとに発生します。つまり、同期化は0、10、20、30、40、50の各分に開始しますが、その間には開始しません。
よって、最短の繰り返し間隔は10分になります。繰り返し指定ですが、同期化が終了してから指定された間隔だけ待ちます。例えば同期化に7分かかる場合、5分毎の繰り返しの設定だと、20分毎に同期化が実行されるようになります(開始時から見ると13分後が次回になり、実行されるタイミングとしては20分後になる)。2分毎であれば10分毎になります(開始時から見ると9分後が次回になり、実行されるタイミングとしては10分後になる)。

RESTデータ・ソースの画面での次の同期化の表示は、10分毎に実行することを考慮した時刻を表示しますが、21.1で追加された同期化タブの表示はそうなっていません。


そのため、こちらのレポートで表示されている次回の実行については、ここで表示されている時刻以降の0,10,20,30,40,50分の一番近い時刻にて同期化が実行される、と読み替える必要があります。

以上でRESTデータ・ソースのCSV対応の紹介は終了です。最後にRESTデータ・ソースを使った対話モード・レポートを作成します。

ページ・デザイナでホーム・ページを開き、Content Body対話モード・レポートをドラッグ&ドロップします。


左ペインより新規となっているリージョンを選択し、識別タイトルCitylistソース位置RESTソースRESTソースとしてCSVソースを選択します。


保存して実行をすると、以下のページが表示されます。


同期化表の使用ONに変更します。


保存して実行をクリックします。今回の例ではリモート表と同期化表のデータに違いはありませんが、実際には同期タイプに従って同期表の内容は、リモート表と差分が発生することになります。


最後に設定のクリアをクリックしてみます。


確認のダイアログにたいして、OKをクリックします。同期化の定義は削除されるが、ローカル表(同期化表)は削除されない、と伝えています。


同期化が構成されていませんと表示され、未構成の状態に戻ります。


今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/csv-data-source.sql

Oracle APEXのアプリケーション作成の参考になれば幸いです。