今回のトピックでは、Oracle APEXのアプリケーションにデータ・ロード・ウィザードを組み込むことにより、より自由度の高いデータ・ロードを実現します。
ただし、データ・ロード・ウィザードで読み込めるファイル形式はCSV(カンマ区切り)やTSV(タブ区切り)といったテキスト・ファイルのみで、XLSX、XML、JSON形式には対応していません。
データ・ロード・ウィザードの組み込み
作成したアプリケーション、新型コロナウイルス感染症陽性患者属性にデータ・ロード・ウィザードを組み込みます。
アプリケーション・ビルダーで上記のアプリケーションを開き、ページの作成を実行します。
コンポーネントのデータのロードを選択し、次へ進みます。
データ・ロード定義を新規作成します。定義名は任意ですが、ここでは陽性患者属性としています。表名はCOVID19_PATIENTSを選択します。一意列の列1をNo、列2をPREFECTURE_NAME(都道府県名)とします。
両方の列により、表COVID19_PATIENTSでのデータを一意に識別できます。表に主キーが設定されていなくても有効です。都道府県毎にデータを更新する際には、一致する行がなければ挿入、行があれば更新という動作になります。この指定が加わることによって、データ・ワークショップでは出来なかった都道府県毎のデータ更新が可能になります。
これまで説明した項目を設定した後、次に進みます。
今はトランスフォーメーション・ルールを作成しません。次に進みます。トランスフォーメーション・ルールはデータ・ロード・ウィザードの作成後に追加します。
表参照も今は作成しません。次に進みます。表参照もデータ・ロード・ウィザードの作成後に追加します。
データ・ロード・ウィザードを構成する4枚のページについて、ページ名やページ番号の指定を行うことができます。デフォルトのまま、次へ進みます。
ナビゲーションのプリファレンスとして、新規ナビゲーション・メニュー・エントリの作成を選びます。次へ進みます。
最後にそれぞれのページのレベルやブランチ先を定義します。「取消」ボタンでブランチするページおよびページへの「終了」ボタン・ブランチは両方とも1(つまりホーム・ページ)を設定します。作成をクリックして、データ・ロード・ウィザードを構成する4枚のページを作成します。
データ・ロード・ウィザードの作成が完了すると、4枚のページが新規に追加されていることが確認できます。
データ・ロード・ウィザードの動作確認
東京都が提供しているデータを、再度、読み込んでみます。
アプリケーションを実行して、ナビゲーション・メニューからデータのロードを選択し、作成したデータ・ロード・ウィザードを呼び出します。インポート元はファイルをアップロード(カンマ区切り(*.csv)またはタブ区切り)を選択し、アップロードするファイル名を指定します。それ以外はデフォルトの設定で次へ進みます。
東京都のデータでは詳細設定の使用はチェックしません。
アップロードするファイルの文字セットがUTF-8以外(例えばShift-JIS)や、日付フォーマットがデフォルトと異なる場合(使用する日付/数値書式にアップロード列のカスタム書式の提供を指定)は、こちらをチェックしてください。以下の選択子が現れます。
アップロード列のカスタム書式を提供を選択すると、次ページのデータと表のマッピング画面に日付/数値書式が追加されます。
ソースの指定から次に進むと、データと表のマッピングの定義画面に移ります。マッピングは、データ・ワークショップのマップ先と同様に設定します。以下の設定になります。
ターゲット列の設定を行い、次へ進みます。
データ・ワークショップでの置換の動作は、表のデータを一旦削除して入れ直します。ですので、アップロードされるファイルからデータが削除されていれば、それも表に反映されます。
つまり、以下のように表にデータがあるとします。
データ・ワークショップを使って、以下のデータをアップロードします。Updateメソッドは置換を選択します。
表に保存されるデータも上記の表になるため、結果として元の表からID1のSMITHの行は無くなります。
データ・ロード・ウィザードの場合は、更新に使われるファイルからデータが削除されていても、表からは削除されません。上記の例を用いると、以下の結果になります。ID1のSMITHの行は残ります。
データ・ロード・ウィザードの基本的な作り方、使い方は以上になります。これから、データ・ロード・ウィザードのカスタマイズについて説明します。
ターゲット列の日本語化
データ・ワークショップは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で記述するデータ・ロードについて紹介する予定です。