2020年7月17日金曜日

Oracle APEXでのデータ・ロード(1) - はじめに

Oracle APEXで実施できるデータ・ロードのいくつか代表的な方法を紹介します。トピックとしては以下を予定しています。
  • はじめに - 表とレポート・アプリケーションの作成
  • データ・ワークショップ
  • データ・ロード・ウィザード
  • APEX_DATA_PARSERパッケージ
  • XMLパーサー
  • CSVによる出力
  • JSONによる出力
各都道府県が公開している新型コロナウイルス感染症の陽性患者データを題材に、それぞれのデータ取り込み方法について解説していきます。また、追加で取り込んだデータを出力する方法についても若干説明を行う予定です。


表の作成


一般社団法人コード・フォー・ジャパンの方々によって、以下の活動が行われています。

新型コロナウイルス感染症対策のためのデータ公開支援

この活動の一環として、「新型コロナウイルス感染症対策に関するオープンデータ項目定義書」が作成されています。今回はその中の陽性患者属性を取り込みの対象とし、この定義書に準拠してデータを保持する表を定義します。本記事はOracle APEXの機能の紹介を目的としており、自治体向けのサイトを構築することは目的としてはいません。公開サイトを構築する場合は、上記URLに記載されている内容に従ってください。

では、「新型コロナウイルス感染症対策に関するオープンデータ項目定義書」(2020年5月25日更新版)に含まれるデータセット名、陽性患者属性の定義に従って表を作成します。表の定義にはクイックSQLを使用します。

SQLワークショップよりユーティリティを開き、クイックSQLを実行します。


クイックSQLによる表定義を左側に記述します。定義は以下になります。
# prefix: covid19
# semantics: default
# genpk: false
PATIENTS
   "No" number
   MUNICIPALITY_CODE   number
   PREFECTURE_NAME     vc16 /nn
   CITY_NAME           vc40
   PUBLISHED_DATE      date
   ONSET_DATE          date
   PATIENT_LOCATION    vc200
   PATIENT_AGE         vc40
   PATIENT_SEX         vc40
   PATIENT_OCCUPATION  vc200
   PATIENT_STATUS      vc200
   PATIENT_SYMPTOM     vc200
   PATIENT_TRAVEL_HISTORY number /check 1,0
   PATIENT_LEFT_HOSPITAL  number /check 1,0
   REMARK              vc200
陽性患者属性とクイックSQLで定義した列名の関係は以下になります。属性定義の詳細は元の定義書を参照してください。

列名

定義書の属性名

No

No

MUNICIPALITY_NAME

全国地方公共団体コード

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

備考


クイックSQLによる定義から、表を作成するSQLが生成されます。生成されるSQLに条件を加えるため、設定をクリックします。


オブジェクト接頭辞としてCOVID19を指定し、主キーは12c identityデータ型を選択します。実際は主キー定義のない表を作りますが、これ以外を選択すると追加のトリガーが生成されます。トリガーの生成を避けるために12c identityデータ型を選択します。


画面下へスクロールし、自動主キーOFFに設定した後、変更の保存を実行します。


設定に準じた形で画面右側に表COVID19_PATIENTSを作成するSQLが表示されます。このSQLを実行して、表を新規作成します。レビューおよび実行の前に、SQLスクリプトを保存を実行します。SQLスクリプトを保存するまでは、レビューおよび実行のボタンはグレーアウトしていて、実行することができません。


スクリプト名は任意ですが、ここではcovid19patientsを入力しています。"_"などの記号はスクリプト名に含められません。スクリプト名を入力したのち、スクリプトを保存をクリックします。


レビューおよび実行のボタンがクリック可能になります。クリックして実行します。


カラム名として"No"としたいところが"no"となっているので、変更します。その後、実行をクリックします。


確認画面が表示されるので、即時実行を行います。


スクリプトの実行結果が表示されます。フィードバックとして「表が作成されました。」、結果として行が成功となっていれば、表が作成されています。アプリケーションの作成をクリックし、アプリケーション作成ウィザードを起動します。


アプリケーションの作成


確認画面が表示されるので、アプリケーションの作成をクリックします。


アプリケーション作成ウィザードでは、名前新型コロナウイルス感染症陽性患者属性とします。


下にスクロールして、ユーザー・インターフェースのデフォルト値をクリックします。


生成されるページのラベルを指定することができます。デフォルトではラベルは表名や列名から導出されるため、英語になります。ここで鉛筆アイコンをクリックしてひとつひとつラベルを日本語に変更することもできますが、今回はJSONを編集することで、一括でラベルを変更します。JSONの表示をクリックします。


JSONが表示されたら、以下の内容で置き換えます。元々の定義に従って、各種ラベルの部分だけを日本語に置き換えています。
{
"applicationDefaults": {
  "name": "Application Defaults",
  "tablePrefixes": "",
  "description": "",
  "tables": [
    {
      "table": "COVID19_PATIENTS",
      "labelSingular": "陽性患者属性",
      "labelPlural": "陽性患者一覧",
      "primaryDisplayColumn": "%",
      "secondaryDisplayColumn": "%",
      "primaryKeyColumn": "%",
      "primaryParentTable": "%",
      "description": ""
    }
  ],
  "tableColumns": [
    {
      "table": "COVID19_PATIENTS",
      "column": "CITY_NAME",
      "label": "市区町村名",
      "formControl": "text",
      "includeOnForms": true,
      "includeOnReports": true,
      "required": false,
      "help": "VARCHAR2"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "MUNICIPALITY_CODE",
      "label": "全国地方公共団体コード",
      "formControl": "numberField",
      "includeOnForms": true,
      "includeOnReports": true,
      "formatMask": "999G999G999G999G999G999G999G999G999G990",
      "required": false,
      "help": "NUMBER"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "NO",
      "label": "No",
      "formControl": "numberField",
      "includeOnForms": true,
      "includeOnReports": true,
      "formatMask": "999G999G999G999G999G999G999G999G999G990",
      "required": false,
      "help": "NUMBER"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "ONSET_DATE",
      "label": "発症_年月日",
      "formControl": "datePicker",
      "includeOnForms": true,
      "includeOnReports": true,
      "required": false,
      "help": "DATE"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "PATIENT_AGE",
      "label": "患者_年代",
      "formControl": "text",
      "includeOnForms": true,
      "includeOnReports": true,
      "required": false,
      "help": "VARCHAR2"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "PATIENT_LEFT_HOSPITAL",
      "label": "患者_退院済フラグ",
      "formControl": "numberField",
      "includeOnForms": true,
      "includeOnReports": true,
      "formatMask": "999G999G999G999G999G999G999G999G999G990",
      "required": false,
      "help": "NUMBER"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "PATIENT_LOCATION",
      "label": "患者_居住地",
      "formControl": "text",
      "includeOnForms": true,
      "includeOnReports": true,
      "required": false,
      "help": "VARCHAR2"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "PATIENT_OCCUPATION",
      "label": "患者_職業",
      "formControl": "text",
      "includeOnForms": true,
      "includeOnReports": true,
      "required": false,
      "help": "VARCHAR2"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "PATIENT_SEX",
      "label": "患者_性別",
      "formControl": "text",
      "includeOnForms": true,
      "includeOnReports": true,
      "required": false,
      "help": "VARCHAR2"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "PATIENT_STATUS",
      "label": "患者_状態",
      "formControl": "text",
      "includeOnForms": true,
      "includeOnReports": true,
      "required": false,
      "help": "VARCHAR2"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "PATIENT_SYMPTOM",
      "label": "患者_症状",
      "formControl": "text",
      "includeOnForms": true,
      "includeOnReports": true,
      "required": false,
      "help": "VARCHAR2"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "PATIENT_TRAVEL_HISTORY",
      "label": "患者_渡航歴の有無フラグ",
      "formControl": "numberField",
      "includeOnForms": true,
      "includeOnReports": true,
      "formatMask": "999G999G999G999G999G999G999G999G999G990",
      "required": false,
      "help": "NUMBER"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "PREFECTURE_NAME",
      "label": "都道府県名",
      "formControl": "text",
      "includeOnForms": true,
      "includeOnReports": true,
      "required": true,
      "help": "VARCHAR2"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "PUBLISHED_DATE",
      "label": "公表_年月日",
      "formControl": "datePicker",
      "includeOnForms": true,
      "includeOnReports": true,
      "required": false,
      "help": "DATE"
    }
    ,
    {
      "table": "COVID19_PATIENTS",
      "column": "REMARK",
      "label": "備考",
      "formControl": "text",
      "includeOnForms": true,
      "includeOnReports": true,
      "required": false,
      "help": "VARCHAR2"
    }
  ],
  "components": {
    "reports": {
      "rowsPerPage": "50",
      "paginationMethod": "nextPrevious",
      "numericFormatMask": "99G999G999G999G999G999G999G999G999G999G990",
      "dateFormatMask": "SINCE"
    }
  }
}
}
内容を置き換えた後、属性デフォルトの適用を実行します。


JSONでの指定が属性デフォルトに反映されます。変更されたラベルを確認した後、アプリケーション作成ウィザードに戻るをクリックします。


表名から導出されたレポート名がPatientsとなっているので変更します。編集をクリックします。


ページ名陽性患者一覧へ変更し、変更の保存をクリックします。


レポート名が変更されていることを確認し、アプリケーションの作成を実行します。


アプリケーションの作成が完了すると、以下の画面が表示されます。


アプリケーションを実行して確認しましょう。