2020年7月17日金曜日

Oracle APEXでのデータ・ロード(3) - データ・ローディング・ウィザード

データ・ワークショップでは一切コーディングをすることなく簡単にデータの取り込みができることを確認しました。ただし、できないこともありました。

今回のトピックでは、Oracle APEXのアプリケーションにデータ・ロード・ウィザードを組み込むことにより、より自由度の高いデータ・ロードを実現します。

ただし、データ・ロード・ウィザードで読み込めるファイル形式はCSV(カンマ区切り)やTSV(タブ区切り)といったテキスト・ファイルのみで、XLSX、XML、JSON形式には対応していません。

データ・ロード・ウィザードの組み込み


作成したアプリケーション、新型コロナウイルス感染症陽性患者属性にデータ・ロード・ウィザードを組み込みます。

アプリケーション・ビルダーで上記のアプリケーションを開き、ページの作成を実行します。


コンポーネントデータのロードを選択し、へ進みます。


データ・ロード定義新規作成します。定義名は任意ですが、ここでは陽性患者属性としています。表名COVID19_PATIENTSを選択します。一意列列1No列2PREFECTURE_NAME(都道府県名)とします。

両方の列により、表COVID19_PATIENTSでのデータを一意に識別できます。表に主キーが設定されていなくても有効です。都道府県毎にデータを更新する際には、一致する行がなければ挿入、行があれば更新という動作になります。この指定が加わることによって、データ・ワークショップでは出来なかった都道府県毎のデータ更新が可能になります。

これまで説明した項目を設定した後、に進みます。


今はトランスフォーメーション・ルールを作成しません。に進みます。トランスフォーメーション・ルールはデータ・ロード・ウィザードの作成後に追加します。


表参照も今は作成しません。に進みます。表参照もデータ・ロード・ウィザードの作成後に追加します。


データ・ロード・ウィザードを構成する4枚のページについて、ページ名ページ番号の指定を行うことができます。デフォルトのまま、へ進みます。


ナビゲーションのプリファレンスとして、新規ナビゲーション・メニュー・エントリの作成を選びます。へ進みます。


最後にそれぞれのページのレベルやブランチ先を定義します。「取消」ボタンでブランチするページおよびページへの「終了」ボタン・ブランチは両方とも(つまりホーム・ページ)を設定します。作成をクリックして、データ・ロード・ウィザードを構成する4枚のページを作成します。


データ・ロード・ウィザードの作成が完了すると、4枚のページが新規に追加されていることが確認できます。


データ・ロード・ウィザードの動作確認


東京都が提供しているデータを、再度、読み込んでみます。

アプリケーションを実行して、ナビゲーション・メニューからデータのロードを選択し、作成したデータ・ロード・ウィザードを呼び出します。インポート元ファイルをアップロード(カンマ区切り(*.csv)またはタブ区切り)を選択し、アップロードするファイル名を指定します。それ以外はデフォルトの設定でへ進みます。


東京都のデータでは詳細設定の使用はチェックしません。

アップロードするファイルの文字セットがUTF-8以外(例えばShift-JIS)や、日付フォーマットがデフォルトと異なる場合(使用する日付/数値書式アップロード列のカスタム書式の提供を指定)は、こちらをチェックしてください。以下の選択子が現れます。


アップロード列のカスタム書式を提供を選択すると、次ページのデータと表のマッピング画面に日付/数値書式が追加されます。


ソースの指定から次に進むと、データと表のマッピングの定義画面に移ります。マッピングは、データ・ワークショップのマップ先と同様に設定します。以下の設定になります。

ソース列マップ先
NONo
全国地方公共団体コードMUNICIPALITY_CODE
都道府県名PREFECTURE_NAME
公表_年月日PUBLISHED_DATE
患者_居住地PATIENT_LOCATION
患者_年代PATIENT_AGE
患者_性別PATIENT_SEX
患者_退院済フラグPATIENT_LEFT_HOSPITAL

ターゲット列の設定を行い、へ進みます。


データ検証の画面に進みます。特にターゲット列の指定に誤りがないか確認します。確認ができたら、データのロードを実行します。


データのロードが完了すると、データ・ロード結果が表示されます。失敗した行、レビューの必要な行がないことを確認し、終了をクリックします。CSVのデータは日々更新されているため、以下のスクリーンショットと実行結果の実数は異なります。


データ・ロード・ウィザードによるデータ・ロードでは、データ・ワークショップとは異なり、すでに行が存在していたら置換、存在していなければ追加という動作になります。

データ・ワークショップでの置換の動作は、表のデータを一旦削除して入れ直します。ですので、アップロードされるファイルからデータが削除されていれば、それも表に反映されます。

つまり、以下のように表にデータがあるとします。

IDNAME
1SMITH
2JOHN
3MARY

データ・ワークショップを使って、以下のデータをアップロードします。Updateメソッドは置換を選択します。

IDNAME
2JOHN
3MARY
4KATE

表に保存されるデータも上記の表になるため、結果として元の表からID1のSMITHの行は無くなります。

データ・ロード・ウィザードの場合は、更新に使われるファイルからデータが削除されていても、表からは削除されません。上記の例を用いると、以下の結果になります。ID1のSMITHの行は残ります。

IDNAME
1SMITH
2JOHN
3MARY
4KATE

データ・ロード・ウィザードの基本的な作り方、使い方は以上になります。これから、データ・ロード・ウィザードのカスタマイズについて説明します。

ターゲット列の日本語化


データ・ワークショップはOracle APEXのアプリケーション開発者やDBAが使う機能であり、表の列名がそのまま表示されていても、それほど支障はないでしょう。しかし、データ・ロード・ウィザードはエンドユーザーが使うものですから、それでは扱いにくいはずです。

データ・ロード定義をカスタマイズすることで、ターゲット列を日本語で表示させることができます。以下にその手順を説明します。

アプリケーションの共有コンポーネントに含まれるデータ・ロード定義を開きます。データ・ソースのカテゴリに含まれます。


先ほど作成した陽性患者属性を開きます。


データ・ロード定義から列名の別名を選択し、LOVの作成を実行します。


列名の別名として、表示順序の設定を行った後、作成をクリックします。


設定内容については表COVID19_PATIENTSを作成する際に定義しています。以下に再掲します。順序はNoから昇順になるように数値を設定します(順序に関しては必須ではありません)。

カラム名

属性名

No

No

MUNICIPALITY_CODE

全国地方公共団体コード

PREFECTURE_NAME

都道府県名

CITY_NAME

市区町村名

PUBLISHED_DATE

公表_年月日

ONSET_DATE

発症_年月日

PATIENT_LOCATION

患者_居住地

PATIENT_AGE

患者_年代

PATIENT_SEX

患者_性別

PATIENT_OCCUPATION

患者_職業

PATIENT_STATUS

患者_状態

PATIENT_SYMPTOM

患者_症状

PATIENT_TRAVEL_HISTORY

患者_渡航歴の有無フラグ

PATIENT_LEFT_HOSPITAL

患者_退院済フラグ

REMARK

備考


LOVが作成されると、列別名LOVとしてLOV_DATALOAD_陽性患者属性が設定されていることが確認できます。念のために、LOVの編集をクリックして、設定を再確認します。


今回は指定しませんが、列名の別名を定義すると、複数のスプレッドシート列を結合して、表の1列にロードさせる設定ができます。例えば、スプレッドシートでは"名字"と"名前"の2列になっているデータを、表では1列のNAMEにロードする、といった設定です。

 
データ・ロード定義の列名の別名が定義されたので、再度、アプリケーションからデータのロードを行い、ターゲット列が日本語になっていることを確認します。


CSVの一行目で定義されている列名と一致していると、デフォルトでターゲット列に選ばれます。そのため、より安全にデータ・ロードを行うことができます。

トランスフォーメーション・ルールの作成


山口県のデータをロードすることで、トランスフォーメーション・ルールの説明を行おうと思います。

山口県のオープンデータを提供しているサイトへアクセスし、陽性患者属性をダウンロードします。サイトへのリンクはこちらになります。


ダウンロードしたファイル350001_yamaguchi_covid19_patients.csvを、データ・ロード・ウィザードを使ってアップロードします。手順は東京都と同じです。データと表のマッピングの設定画面にて、CSVの列名が公表_年月日ではなく公表日となっているため、自動的にマッピング列が選択されません。ここは手動でマッピング列を指定します。

患者_年代のデータを確認すると、40代ではなく40代となっています。このままデータをロードすると患者_年代での集計ができません。トランスフォーメーション・ルールを設定することにより、データ・ロード時に40代を40代に変換することができます。


これから、山口県の患者_年代のデータより"歳"を取り除くトランスフォーメーション・ルールを設定します。

列名の別名を定義したときと同様に、データ・ロード定義陽性患者属性を開き、トランスフォーメーション・ルールを選択します。そして、トランスフォーメーション・ルールの作成を実行します。


トランスフォーメーション・ルールの作成画面が表示されます。変換を行う対象列を列名として選択します。今回はPATIENT_AGEです。ルール名は任意ですが、歳を除くとしています。ルール・タイプにはコーディングが不要なタイプも多数ありますが、今回は最も柔軟な記述ができるPL/SQLファンクション本体を選びました。PL/SQLのファンクション本体として、式1に以下のコードを記述します。REPLACEファンクションを使って、歳の文字を取り除いています(実は、ルール・タイプの置換を選択することで、コードを書かずに同じことができます)。すべてを入力後に作成をクリックします。
begin
    return replace(:PATIENT_AGE, '歳');
end;

作成が完了すると、トランスフォーメーション・ルールが一覧画面にリストされます。ルール・タイプがPL/SQLファンクション本体の場合は、式2にバインド変数が現れていることを確認してください。


マニュアルに明記されていませんが、トランスフォーメーション・ルールで参照できるのは、変換対象の列のみのようです。つまり上記の例では、PATIENT_AGE(患者_年代)のデータのみで、例えば、PATIENT_OCCUPATION(患者_職業)を参照してPATIENT_AGEを設定するといったことはできません。

再度、山口県のデータをロードすることで、トランスフォーメーション・ルールの効果を確認します。データのロードを行う手順は変わりありません。

データ検証のページまで進むと、患者_年代のデータを確認できます。歳の字は除かれています。


データのロードを実行すると、山口県のデータが表COVID19_PATIENTSに追加されます。

表参照の作成


列PREFECTURE_NAME(都道府県名)はデータとして必須ですが、全国地方公共団体コードは必ずしも必要ではないデータです。都道府県名とは1対1で対応するデータであるため、対応表さえ用意されていれば、都道府県名から設定することができます。

全国地方公共団体コードが未入力の際に、その値を都道府県名から設定するために、表参照の設定を使うことができます。

データ・ワークショップを使って、表COVID19_MUNICIPALITIESを作成し、以下のデータを投入します。
"CODE","NAME"
"10006","北海道"
"20001","青森県"
"30007","岩手県"
"40002","宮城県"
"50008","秋田県"
"60003","山形県"
"70009","福島県"
"80004","茨城県"
"90000","栃木県"
"100005","群馬県"
"110001","埼玉県"
"120006","千葉県"
"130001","東京都"
"140007","神奈川県"
"150002","新潟県"
"160008","富山県"
"170003","石川県"
"180009","福井県"
"190004","山梨県"
"200000","長野県"
"210005","岐阜県"
"220001","静岡県"
"230006","愛知県"
"240001","三重県"
"250007","滋賀県"
"260002","京都府"
"270008","大阪府"
"280003","兵庫県"
"290009","奈良県"
"300004","和歌山県"
"310000","鳥取県"
"320005","島根県"
"330001","岡山県"
"340006","広島県"
"350001","山口県"
"360007","徳島県"
"370002","香川県"
"380008","愛媛県"
"390003","高知県"
"400009","福岡県"
"410004","佐賀県"
"420000","長崎県"
"430005","熊本県"
"440001","大分県"
"450006","宮崎県"
"460001","鹿児島県"
"470007","沖縄県"
データ・ワークショップを開いて、データのロードを実行します。


コピー・アンド・ペーストを選択し、全国地方公共団体コード都道府県名の対応データを貼り付けます。その後、へ進みます。


データのロードの定義画面に移行します。ロード表新規表とし、表名COVID19_MUNICIPALITEISとします。列見出し最初の行にヘッダーが含まれるにチェックを入れます(コピー・アンド・ペーストによるデータのロードの場合はデフォルトではチェックされていません)。列デリミタとして,(カンマ)囲み文字として"(ダブルクオート)を選択します。プレビューの表示を確認して、データのロードを実行します。


47都道府県分、つまり47行を含む表が作成されていて、表名が正しければ完成です。右上の✖︎をクリックしてウィンドウを閉じます。


アプリケーション・ビルダーに戻り、表参照の作成を行います。アプリケーションのデータ・ロード定義陽性患者属性を開き、表参照を選択します。そして、表参照の作成を実行します。


表COVID19_PATIENTSで表参照が適用される列名MUNICIPALITY_CODEと指定し、参照される表名として先ほど作成した表COVID19_MUNICIPALITIESを指定します。戻り列はCODEで、アップロード列はNAMEを指定し、作成を実行します。

このように設定すると、全国地方公共団体コードとしてアップロードされるデータは、NAMEに対応する文字列、つまり都道府県名が期待されますが、実際にMUNICIPALITY_CODE、つまり全国地方公共団体コードとして保存されるデータは、CODE列に対応する数値、つまり全国地方公共団体コードが保存されます。


改変したデータをロードすることで、動作を確認してみます。以下のデータをコピー・アンド・ペーストでロードしてみます。
No,全国地方公共団体コード,都道府県名,市区町村名,陽性確定日,公表日,患者_年代,患者_性別,備考
1,山口県,山口県,下関市,2020/3/3,2020/3/4,40歳代,男性,県外へ出張
全国地方公共団体コードに350001を山口県へ変更しています。このデータをロードします。次に進みます。


データと表のマッピングの画面でアップロードされたデータを確認できます。全国地方公共団体コードとして山口県がアップロードされていることが確認できます。次に進みます。


全国地方公共団体コード(MUNICIPALITY_CODE)のデータ型は数値ですから、このままではアップロードに失敗しますが、データ検証の画面では表参照が適用され、350001と、全国地方公共団体コードに変換されていることが確認できます。


表参照の使い方は以上になります。

今回の表COVID19_PATIENTSは全国地方公共団体コードと都道府県名の両方が列にあるため、表参照の設定は不要です。もし、表COVID19_PATIENTSの定義に全国地方公共団体コードのみがあり、アップロードされるCSVファイルには都道府県名しか含まれないという条件であれば、表参照は有効に使えます。また、参照制約のあるマスター・ディテールの関係である表の、ディテール表へのデータ・ロードであれば、このような条件になります。このような場合に、表参照を便利に使えるはずです。

これ以降の作業で、この表参照の定義があるとデータのアップロードができないため、削除してください。


データ・ワークショップはノー・コード、データ・ロード・ウィザードはノー・コードとロー・コードの間くらいのソリューションです。次のセクションでは、フル・コード、PL/SQLで記述するデータ・ロードについて紹介する予定です。