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データ・ソース・タイプとして簡易HTTPを選択します。名前はCSVソースとします。URLエンドポイントにテストで使うデータのURL(ここではGitHub上のCSVファイル)を指定します。次へ進みます。
認証が必要ですはOFFとし、検出をクリックします。
データ・プロファイルのレスポンス・タイプとしてCSVが認識されています。先頭のヘッダー行よりセレクタや列の名前は適切に認識されていますが、IDは主キーとして認識してほしいところがそうではなく、PREFECTUREおよびCITYのVARCHAR2の長さが4000になっています。CSVファイルには、そのようなメタデータは含まれていないので仕方がありません。これらは後ほど調整します。
RESTデータ・ソースの作成を実行します。
RESTデータ・ソースが作成されます。Oracle APEX 21.1より同期化タブが追加されました。
クリックして確認してみます。REST同期化の設定は行なっていないので、今のところ何もリストされません。
RESTデータ・ソースのタブに戻り、CSVソースを開きます。CSVのデータからは決定できなかった設定を修正するため、データ・プロファイルの編集を行います。
修正する対象はID、PREFECTUREおよび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のアプリケーション作成の参考になれば幸いです。
完