2024年6月6日木曜日

デジタル庁が整備しているアドレス・ベース・レジストリをデータベースにロードする

デジタル庁がアドレス・ベース・レジストリとして整備している住所・所在地データを、Autonomous Databaseに取り込んでみます。簡易的なジオコーディング、逆ジオコーディングを行うための、元データとして使用することを想定しています。

デジタル庁によるアドレス・ベース・レジストリの説明は、次のサイトに掲載されています。

アドレス・ベース・レジストリ

まず、データを投入する表を作成します。表を定義するにあたって、2024年1月15日に更新されたデータフォーマット(仕様確定版)を参照しています。

Excelに記載された仕様から表定義を作成するにあたって、Oracle DatabaseおよびOracle APEXとして扱いやすくなるよう、いくつか定義の解釈を変えています。
  1. PKとして指定されている主キーについては、主キーではなく一意制約として作成しています。データをインポートする表に主キーは定義していません。このようにした理由は後述します。
  2. 町字マスター(Excelシートとしては03町字)のNo.21 chome_number丁目名_数字)は文字列(半角数字)ではなく、データ型としては整数として定義しています。改訂履歴を見ると2.00版(2023年12月28日改訂)で、データ型を整数から文字列に変更していますが、chome_numberだけは文字列だと制約の設定が難しかったためです。これは町字マスター(フルセット)に含まれるchome_numberも同様です。
  3. 住居表示-住居マスター(Excelシートとしては06住居表示-住居)では、効力発生日のみPKと指定されています。効力発生日のみで一意にはできないため、一意制約の設定はしていません。
  4. Excelのデータフォーマットでは、同一町字識別情報machiaza_dist)は、03町字および07町字フルセットで定義されていますが、04地番05住居表示-街区06住居表示-住居には定義されていません。しかし、レジストリカタログからダウンロードできるCSVのデータには、列としてmachiaza_distが含まれているため、これらのマスター表にも列としてmachiaza_distを追加しています。
町字地番住居表示-街区住居表示-住居町字フルセットのマスターでは、主キーに効力発生日が含まれます。試験公開されているアドレス・ベース・レジストリデータ解説書(試験公開版)を参照すると、3.5 効力発生日と廃止日として以下の説明があります。
3.5 効力発生日と廃止日

アドレス・ベース・レジストリの各テーブル(位置参照拡張を除く)には、「効力発生日」 「廃止日」のフィールドを用意しています。これらは、初期データ整備では収録していませ んが、今後のアドレス・ベース・レジストリ運用において、過去のレコードを保持できるよ うにすること、変更時に変更前後の情報を両方保持できるようにすること等を想定して、あ らかじめ項目だけ用意しているものです。
都道府県と市区町村マスター、および、それぞれの位置参照拡張は異なりますが、アドレス・ベース・レジストリとして配布されるデータは履歴を含むようです。今回はジオコーディングや逆ジオコーディングでのデータ利用を想定しているため、必要なのは最新のデータに限定されます。

アドレス・ベース・レジストリから取得するCSVは、あくまでデータ交換用として扱い、ロード先の表は、インターフェース表(データ交換のために一時的にデータをロードする表)として作成します。ジオコーディングや逆ジオコーディングに使う表は別途定義し、インターフェース表にアップロードした住所・所在地データをインポートすることにします。

本記事では、インターフェース表の作成とアドレス・ベース・レジストリとして入手できるCSVのロード(を行うAPEXアプリケーションの作成)までの作業を行います。

クイックSQLの以下のモデルから、アドレス・ベース・レジストリのマスター・データをインポートするインターフェース表を作成します。

# prefix: mt
# genpk: false
# semantics: char
pref /unique lg_code --都道府県マスター
lg_code vc6 /nn --全国地方公共団体コード
pref vc10 /nn --都道府県名
pref_kana vc50 --都道府県名_カナ
pref_roma vc50 --都道府県名_英字
efct_date date --効力発生日
ablt_date date --廃止日
remarks vc256 --備考
city /unique lg_code --市区町村マスター
lg_code vc6 /nn --全国地方公共団体コード
pref vc10 /nn --都道府県名
pref_kana vc50 --都道府県名_カナ
pref_roma vc50 --都道府県名_英字
county vc24 --郡名
county_kana vc50 --郡名_カナ
county_roma vc100 --郡名_英字
city vc24 /nn --市区町村名
city_kana vc50 --市区町村名_カナ
city_roma vc100 --市区町村名_英字
ward vc24 --政令市区名
ward_kana vc50 --政令市区名_カナ
ward_roma vc100 --政令市区名_英字
efct_date date --効力発生日
ablt_date date --廃止日
remarks vc256 --備考
town /unique lg_code,machiaza_id,rsdt_addr_flg,efct_date --町字マスター
lg_code vc6 /nn --全国地方公共団体コード
machiaza_id vc7 /nn --町字ID
machiaza_type vc1 /nn --町字区分コード
pref vc10 /nn --都道府県名
pref_kana vc50 --都道府県名_カナ
pref_roma vc50 --都道府県名_英字
county vc24 --郡名
county_kana vc50 --郡名_カナ
county_roma vc100 --郡名_英字
city vc24 /nn --市区町村名
city_kana vc50 --市区町村名_カナ
city_roma vc100 --市区町村名_英字
ward vc24 --政令市区名
ward_kana vc50 --政令市区名_カナ
ward_roma vc100 --政令市区名_英字
oaza_cho vc120 --大字・町名
oaza_cho_kana vc240 --大字・町名_カナ
oaza_cho_roma vc180 --大字・町名_英字
chome vc32 --丁目名
chome_kana vc50 --丁目名_カナ
chome_number num(2) --丁目名_数字
koaza vc120 --小字名
koaza_kana vc240 --小字名_カナ
koaza_roma vc180 --小字名_英字
machiaza_dist vc120 --同一町字識別情報
rsdt_addr_flg vc1 /nn --住居表示フラグ
rsdt_addr_mtd_code vc1 --住居表示方式コード
oaza_cho_aka_flg vc1 --大字・町名_通称フラグ
koaza_aka_code vc1 --小字名_通称コード
oaza_cho_gsi_uncmn vc50 --大字・町名_電子国土基本図外字
koaza_gsi_uncmn vc50 --小字名_電子国土基本図外字
status_flg vc1 --状態フラグ
wake_num_flg vc1 --起番フラグ
efct_date date /nn --効力発生日
ablt_date date --廃止日
src_code vc2 --原典資料コード
post_code vc80 --郵便番号
remarks vc256 --備考
parcel /unique lg_code,machiaza_id,prc_id,prc_num1,rsdt_addr_flg,efct_date --地番マスター
lg_code vc6 /nn --全国地方公共団体コード
machiaza_id vc7 /nn --町字ID
prc_id vc15 /nn --地番ID
city vc24 /nn --市区町村名
ward vc24 --政令市区名
oaza_cho vc120 --大字・町名
chome vc32 --丁目名
koaza vc120 --小字名
machiaza_dist vc120 --同一町字識別情報
prc_num1 vc5 /nn --地番1
prc_num2 vc5 --地番2
prc_num3 vc5 --地番3
rsdt_addr_flg vc1 /nn --住居表示フラグ
prc_rec_flg vc1 --地番レコード区分フラグ
prc_area_code vc1 --地番区域コード
efct_date date /nn --効力発生日
ablt_date date --廃止日
src_code vc1 --原典資料コード
remarks vc256 --備考
real_prop_num vc13 --不動産番号
rsdtdsp_blk /unique lg_code,machiaza_id,blk_id,rsdt_addr_flg,efct_date --住居表示-街区マスター
lg_code vc6 /nn --全国地方公共団体コード
machiaza_id vc7 /nn --町字ID
blk_id vc3 /nn --街区ID
city vc24 /nn --市区町村名
ward vc24 --政令市区名
oaza_cho vc120 --大字・町名
chome vc32 --丁目名
koaza vc120 --小字名
machiaza_dist vc120 --同一町字識別情報
blk_num vc20 --街区符号
rsdt_addr_flg vc1 /nn --住居表示フラグ
rsdt_addr_mtd_code vc1 --住居表示方式コード
status_flg vc1 --状態フラグ
efct_date date /nn --効力発生日
ablt_date date --廃止日
src_code vc1 --原典資料コード
remarks vc256 --備考
rsdtdsp_rsdt --住居表示-住居マスター
lg_code vc6 /nn --全国地方公共団体コード
machiaza_id vc7 /nn --町字ID
blk_id vc3 /nn --街区ID
rsdt_id vc3 /nn --住居ID
rsdt2_id vc5 --住居2ID
city vc24 /nn --市区町村名
ward vc24 --政令市区名
oaza_cho vc120 --大字・町名
chome vc32 --丁目名
koaza vc120 --小字名
machiaza_dist vc120 --同一町字識別情報
blk_num vc20 --街区符号
rsdt_num vc5 /nn --住居番号
rsdt_num2 vc5 --住居番号2
basic_rsdt_div vc1 --基礎番号・住居番号区分
rsdt_addr_flg vc1 /nn --住居表示フラグ
rsdt_addr_mtd_code vc1 --住居表示方式コード
status_flg vc1 --状態フラグ
efct_date date /nn --効力発生日
ablt_date date --廃止日
src_code vc1 --原典資料コード
remarks vc256 --備考
town_fullset /unique lg_code,machiaza_id,rsdt_addr_flg,efct_date --町字マスター(フルセット)
lg_code vc6 /nn --全国地方公共団体コード
machiaza_id vc7 /nn --町字ID
machiaza_type vc1 /nn --町字区分コード
pref vc10 /nn --都道府県名
pref_kana vc50 --都道府県名_カナ
pref_roma vc50 --都道府県名_英字
county vc24 --郡名
county_kana vc50 --郡名_カナ
county_roma vc100 --郡名_英字
city vc24 /nn --市区町村名
city_kana vc50 --市区町村名_カナ
city_roma vc100 --市区町村名_英字
ward vc24 --政令市区名
ward_kana vc50 --政令市区名_カナ
ward_roma vc100 --政令市区名_英字
oaza_cho vc120 --大字・町名
oaza_cho_kana vc240 --大字・町名_カナ
oaza_cho_roma vc180 --大字・町名_英字
chome vc32 --丁目名
chome_kana vc50 --丁目名_カナ
chome_number num(2) --丁目名_数字
koaza vc120 --小字名
koaza_kana vc240 --小字名_カナ
koaza_roma vc180 --小字名_英字
machiaza_dist vc120 --同一町字識別情報
rsdt_addr_flg vc1 /nn --住居表示フラグ
rsdt_addr_mtd_code vc1 --住居表示方式コード
oaza_cho_aka_flg vc1 --大字・町名_通称フラグ
koaza_aka_code vc1 --小字名_通称コード
oaza_cho_gsi_uncmn vc50 --大字・町名_電子国土基本図外字
koaza_gsi_uncmn vc50 --小字名_電子国土基本図外字
status_flg vc1 --状態フラグ
wake_num_flg vc1 --起番フラグ
efct_date date /nn --効力発生日
ablt_date date --廃止日
src_code vc2 --原典資料コード
post_code vc80 --郵便番号
oaza_cho_uncmn_reg vc240 --大字・町名_登記統一文字
oaza_cho_uncmn_mj vc240 --大字・町名_MJ文字図形名
oaza_cho_uncmn_type vc2 --大字・町名_任意外字コード種別
oaza_cho_uncmn_code vc240 --大字・町名_任意外字コード
koaza_uncmn_reg vc240 --小字名_登記統一文字
koaza_uncmn_mj vc240 --小字名_MJ文字図形名
koaza_uncmn_type vc2 --小字名_任意外字コード種別
koaza_uncmn_code vc240 --小字名_任意外字コード
alias_oaza vc360 --別名称大字・町名
alias_oaza_kana vc720 --別名称大字・町名_カナ
alias_oaza_roma vc540 --別名称大字・町名_英字
alias_koaza vc360 --別名称小字名
alias_koaza_kana vc720 --別名称小字名_カナ
alias_koaza_roma vc540 --別名称小字名_英字
remarks vc256 --備考
pref_pos /unique lg_code --都道府県マスター位置参照拡張
lg_code vc6 /nn --全国地方公共団体コード
rep_lon num --代表点_経度
rep_lat num --代表点_緯度
rep_srid vc32 --代表点_座標参照系
rep_scale vc6 --代表点_地図情報レベル
plygn_fname vc512 --ポリゴン_ファイル名
plygn_kcode vc64 --ポリゴン_キーコード
plygn_fmt vc24 --ポリゴン_データフォーマット
plygn_srid vc32 --ポリゴン_座標参照系
plygn_scale vc6 --ポリゴン_地図情報レベル
city_pos /unique lg_code --市区町村マスター位置参照拡張
lg_code vc6 /nn --全国地方公共団体コード
rep_lon num --代表点_経度
rep_lat num --代表点_緯度
rep_srid vc32 --代表点_座標参照系
rep_scale vc6 --代表点_地図情報レベル
plygn_fname vc512 --ポリゴン_ファイル名
plygn_kcode vc64 --ポリゴン_キーコード
plygn_fmt vc24 --ポリゴン_データフォーマット
plygn_srid vc32 --ポリゴン_座標参照系
plygn_scale vc6 --ポリゴン_地図情報レベル
town_pos /unique lg_code,machiaza_id,rsdt_addr_flg --町字マスター位置参照拡張
lg_code vc6 /nn --全国地方公共団体コード
machiaza_id vc7 /nn --町字ID
rsdt_addr_flg vc1 /nn --住居表示フラグ
rep_lon num --代表点_経度
rep_lat num --代表点_緯度
rep_srid vc32 --代表点_座標参照系
rep_scale vc6 --代表点_地図情報レベル
rep_src_code vc1 --代表点_原典資料コード
plygn_fname vc512 --ポリゴン_ファイル名
plygn_kcode vc64 --ポリゴン_キーコード
plygn_fmt vc24 --ポリゴン_データフォーマット
plygn_srid vc32 --ポリゴン_座標参照系
plygn_scale vc6 --ポリゴン_地図情報レベル
plygn_src_code vc1 --ポリゴン_原典資料コード
pos_oaza_cho_chome_code vc12 --位置参照情報_大字町丁目コード
pos_data_mnt_year vc4 --位置参照情報_データ整備年度
cns_bnd_s_area_kcode vc64 --国勢調査_境界_小地域(町丁・字等別)_KEY_CODE
cns_bnd_year vc4 --国勢調査_境界_データ整備年度
parcel_pos /unique lg_code,machiaza_id,prc_id --地番マスター位置参照拡張
lg_code vc6 /nn --全国地方公共団体コード
machiaza_id vc7 /nn --町字ID
prc_id vc15 /nn --地番ID
rep_lon num --代表点_経度
rep_lat num --代表点_緯度
rep_srid vc32 --代表点_座標参照系
rep_scale vc6 --代表点_地図情報レベル
rep_src_code vc1 --代表点_原典資料コード
plygn_fname vc512 --ポリゴン_ファイル名
plygn_kcode vc64 --ポリゴン_キーコード
plygn_fmt vc24 --ポリゴン_データフォーマット
plygn_srid vc32 --ポリゴン_座標参照系
plygn_scale vc6 --ポリゴン_地図情報レベル
plygn_src_code vc1 --ポリゴン_原典資料コード
moj_map_city_code vc5 --法務省地図_市区町村コード
moj_map_oaza_code vc3 --法務省地図_大字コード
moj_map_chome_code vc3 --法務省地図_丁目コード
moj_map_koaza_code vc4 --法務省地図_小字コード
moj_map_spare_code vc2 --法務省地図_予備コード
moj_map_brushid vc10 --法務省地図_筆id
rsdtdsp_blk_pos /unique lg_code,machiaza_id,blk_id,rep_lon,rep_lat --住居表示-街区マスター位置参照拡張
lg_code vc6 /nn --全国地方公共団体コード
machiaza_id vc7 /nn --町字ID
blk_id vc3 /nn --街区ID
rsdt_addr_flg vc1 --住居表示フラグ
rsdt_addr_mtd_code vc1 --住居表示方式コード
rep_lon num /nn --代表点_経度
rep_lat num /nn --代表点_緯度
rep_srid vc32 --代表点_座標参照系
rep_scale vc6 --代表点_地図情報レベル
rep_src_code vc1 --代表点_原典資料コード
plygn_fname vc512 --ポリゴン_ファイル名
plygn_kcode vc64 --ポリゴン_キーコード
plygn_fmt vc24 --ポリゴン_データフォーマット
plygn_srid vc32 --ポリゴン_座標参照系
plygn_scale vc6 --ポリゴン_地図情報レベル
plygn_src_code vc1 --ポリゴン_原典資料コード
pos_pref vc12 --位置参照情報_都道府県名
pos_city vc24 --位置参照情報_市区町村名
pos_oaza_cho_chome vc32 --位置参照情報_大字・町丁目名
pos_koaza_aka vc32 --位置参照情報_小字・通称名
pos_blk_prc_num vc20 --位置参照情報_街区符号・地番
pos_data_mnt_year vc4 --位置参照情報_データ整備年度
rsdt_addr_code_rdbl vc64 --電子国土基本図(地名情報)「住居表示住所」_住所コード(可読)
rsdt_addr_data_mnt_date date --電子国土基本図(地名情報)「住居表示住所」_データ整備日
rsdtdsp_rsdt_pos /unique lg_code,machiaza_id,blk_id,rsdt_id,rep_lon,rep_lat --住居表示-住居マスター位置参照拡張
lg_code vc6 /nn --全国地方公共団体コード
machiaza_id vc7 /nn --町字ID
blk_id vc3 /nn --街区ID
rsdt_id vc3 /nn --住居ID
rsdt2_id vc5 --住居2ID
rsdt_addr_flg vc1 --住居表示フラグ
rsdt_addr_mtd_code vc1 --住居表示方式コード
rep_lon num /nn --代表点_経度
rep_lat num /nn --代表点_緯度
rep_srid vc32 --代表点_座標参照系
rep_scale vc6 --代表点_地図情報レベル
rep_src_code vc1 --代表点_原典資料コード
rsdt_addr_code_rdbl vc64 --電子国土基本図(地名情報)「住居表示住所」_住所コード(可読)
rsdt_addr_data_mnt_date date --電子国土基本図(地名情報)「住居表示住所」_データ整備日
basic_rsdt_div vc1 --基礎番号・住居番号区分
クイックSQLを開き、左ペインにモデルを記述して、レビューおよび実行をクリックします。


スクリプト名を入力し、実行をクリックします。


即時実行をクリックします。


DDLが実行され、それぞれの表が作成されます。エラーが発生していないことを確認します。

アプリケーションの作成をクリックします。


確認画面が開くので、アプリケーションの作成をクリックします。


アプリケーション作成ウィザードが開きます。アプリケーションの名前Address Base Registyとします。

あらかじめ、クイックSQLのモデルで定義した13の表を対象としたフォーム付き対話モード・レポートのページが追加されています。

そのまま、アプリケーションの作成を実行します。


アプリケーションAddress Base Registryが作成されます。


アプリケーションを実行し、サインインします。それぞれの表の対話モード・レポートへのリンクが作成されています。


今の所、まったくデータはロードしていないため、どのレポートのページを開いても、何も表示されません。


これから、このアプリケーションにデータをロードする機能を追加していきます。

その前に、これらの表に制約を設定します。以下のSQLを実行します。

-- pref
alter table mt_pref add constraint mt_pref_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
-- city
alter table mt_city add constraint mt_city_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
-- town
alter table mt_town add constraint mt_town_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
alter table mt_town add constraint mt_town_matchiaza_id_ck check (regexp_like (machiaza_id, '^\d{7}$'));
alter table mt_town add constraint mt_town_matchiaza_type_ck check (machiaza_type in ('1','2','3','4','5'));
alter table mt_town add constraint mt_town_rsdt_addr_flg_ck check (rsdt_addr_flg in ('1','0'));
alter table mt_town add constraint mt_town_rsdt_addr_mtd_code_ck check (rsdt_addr_mtd_code in ('1','2','0'));
alter table mt_town add constraint mt_town_oaza_cho_aka_flg_ck check (oaza_cho_aka_flg in ('0','1'));
alter table mt_town add constraint mt_town_koaza_aka_code_ck check (koaza_aka_code in ('0','1','2','3'));
alter table mt_town add constraint mt_town_status_flg_ck check (status_flg in ('0','1','2','3'));
alter table mt_town add constraint mt_town_wake_num_flg_ck check (wake_num_flg in ('1','2','0'));
alter table mt_town add constraint mt_town_src_code_ck check (src_code in ('1','11','12','13','10','0'));
-- parcel
alter table mt_parcel add constraint mt_parcel_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
alter table mt_parcel add constraint mt_parcel_matchiaza_id_ck check (regexp_like (machiaza_id, '^\d{7}$'));
alter table mt_parcel add constraint mt_parcel_prc_id_ck check (regexp_like (prc_id, '^\d{15}$'));
alter table mt_parcel add constraint mt_parcel_rsdt_addr_flg_ck check (rsdt_addr_flg in ('1','0'));
alter table mt_parcel add constraint mt_parcel_prc_rec_flg_ck check (prc_rec_flg in ('1','0'));
alter table mt_parcel add constraint mt_parcel_prc_area_code_ck check (prc_area_code in ('1','2','3'));
-- rsdtdsp_blk
alter table mt_rsdtdsp_blk add constraint mt_rsdtdsp_blk_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
alter table mt_rsdtdsp_blk add constraint mt_rsdtdsp_blk_matchiaza_id_ck check (regexp_like (machiaza_id, '^\d{7}$'));
alter table mt_rsdtdsp_blk add constraint mt_rsdtdsp_blk_blk_id_ck check (regexp_like (blk_id, '^\d{3}$'));
alter table mt_rsdtdsp_blk add constraint mt_rsdtdsp_blk_rsdt_addr_flg_ck check (rsdt_addr_flg in ('1','0'));
alter table mt_rsdtdsp_blk add constraint mt_rsdtdsp_blk_rsdt_addr_mtd_code_ck check (rsdt_addr_mtd_code in ('1','2','0'));
alter table mt_rsdtdsp_blk add constraint mt_rsdtdsp_blk_status_flg_ck check (status_flg in ('0','1','2','3'));
alter table mt_rsdtdsp_blk add constraint mt_rsdtdsp_blk_src_code_ck check (src_code in ('1','0'));
-- rsdtdsp_rsdt
alter table mt_rsdtdsp_rsdt add constraint mt_rsdtdsp_rsdt_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
alter table mt_rsdtdsp_rsdt add constraint mt_rsdtdsp_rsdt_matchiaza_id_ck check (regexp_like (machiaza_id, '^\d{7}$'));
alter table mt_rsdtdsp_rsdt add constraint mt_rsdtdsp_rsdt_blk_id_ck check (regexp_like (blk_id, '^\d{3}$'));
alter table mt_rsdtdsp_rsdt add constraint mt_rsdtdsp_rsdt_rsdt_id_ck check (regexp_like (rsdt_id, '^\d{3}$'));
alter table mt_rsdtdsp_rsdt add constraint mt_rsdtdsp_rsdt_rsdt2_id_ck check (regexp_like (rsdt2_id, '^\d{5}$'));
alter table mt_rsdtdsp_rsdt add constraint mt_rsdtdsp_rsdt_basic_rsdt_div_ck check (basic_rsdt_div in ('0','1'));
alter table mt_rsdtdsp_rsdt add constraint mt_rsdtdsp_rsdt_rsdt_addr_flg_ck check (rsdt_addr_flg in ('1','0'));
alter table mt_rsdtdsp_rsdt add constraint mt_rsdtdsp_rsdt_rsdt_addr_mtd_code_ck check (rsdt_addr_mtd_code in ('1','2','0'));
alter table mt_rsdtdsp_rsdt add constraint mt_rsdtdsp_rsdt_status_flg_ck check (status_flg in ('0','1','2','3'));
alter table mt_rsdtdsp_rsdt add constraint mt_rsdtdsp_rsdt_src_code_ck check (src_code in ('1','0'));
-- town_fullset
alter table mt_town_fullset add constraint mt_town_f_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
alter table mt_town_fullset add constraint mt_town_f_matchiaza_id_ck check (regexp_like (machiaza_id, '^\d{7}$'));
alter table mt_town_fullset add constraint mt_town_f_matchiaza_type_ck check (machiaza_type in ('1','2','3','4','5'));
alter table mt_town_fullset add constraint mt_town_f_rsdt_addr_flg_ck check (rsdt_addr_flg in ('1','0'));
alter table mt_town_fullset add constraint mt_town_f_rsdt_addr_mtd_code_ck check (rsdt_addr_mtd_code in ('1','2','0'));
alter table mt_town_fullset add constraint mt_town_f_oaza_cho_aka_flg_ck check (oaza_cho_aka_flg in ('0','1'));
alter table mt_town_fullset add constraint mt_town_f_koaza_aka_code_ck check (koaza_aka_code in ('0','1','2','3'));
alter table mt_town_fullset add constraint mt_town_f_status_flg_ck check (status_flg in ('0','1','2','3'));
alter table mt_town_fullset add constraint mt_town_f_wake_num_flg_ck check (wake_num_flg in ('1','2','0'));
alter table mt_town_fullset add constraint mt_town_f_src_code_ck check (src_code in ('1','11','12','13','10','0'));
alter table mt_town_fullset add constraint mt_town_f_oaza_cho_uncmn_type_ck check (oaza_cho_uncmn_type in ('00','01','02'));
alter table mt_town_fullset add constraint mt_town_f_koaza_uncmn_type_ck check (koaza_uncmn_type in ('00','01','02'));
-- pref_pos
alter table mt_pref_pos add constraint mt_pref_p_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
-- city_pos
alter table mt_city_pos add constraint mt_city_p_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
-- town_pos
alter table mt_town_pos add constraint mt_town_p_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
alter table mt_town_pos add constraint mt_town_p_matchiaza_id_ck check (regexp_like (machiaza_id, '^\d{7}$'));
alter table mt_town_pos add constraint mt_town_p_rsdt_addr_flg_ck check (rsdt_addr_flg in ('1','0'));
alter table mt_town_pos add constraint mt_town_p_rep_src_code_ck check (rep_src_code in ('0','1','2','3','4'));
alter table mt_town_pos add constraint mt_town_p_plygn_src_code_ck check (plygn_src_code in ('0','1','2','3','4'));
alter table mt_town_pos add constraint mt_town_p_pos_oaza_cho_chome_code_ck check (regexp_like (pos_oaza_cho_chome_code, '^\d{12}$'));
alter table mt_town_pos add constraint mt_town_p_pos_data_mnt_year_ck check (regexp_like (pos_data_mnt_year, '^\d{4}$'));
alter table mt_town_pos add constraint mt_town_p_cns_bnd_year_ck check (regexp_like (cns_bnd_year, '^\d{4}$'));
-- parcel_pos
alter table mt_parcel_pos add constraint mt_parcel_p_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
alter table mt_parcel_pos add constraint mt_parcel_p_matchiaza_id_ck check (regexp_like (machiaza_id, '^\d{7}$'));
alter table mt_parcel_pos add constraint mt_parcel_p_prc_id_ck check (regexp_like (prc_id, '^\d{15}$'));
alter table mt_parcel_pos add constraint mt_parcel_p_rep_src_code_ck check (rep_src_code in ('0','1','2'));
alter table mt_parcel_pos add constraint mt_parcel_p_plygn_src_code_ck check (plygn_src_code in ('0','1','2'));
-- rsdtdsp_blk_pos
alter table mt_rsdtdsp_blk_pos add constraint mt_rsdtdsp_blk_p_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
alter table mt_rsdtdsp_blk_pos add constraint mt_rsdtdsp_blk_p_matchiaza_id_ck check (regexp_like (machiaza_id, '^\d{7}$'));
alter table mt_rsdtdsp_blk_pos add constraint mt_rsdtdsp_blk_p_blk_id_ck check (regexp_like (blk_id, '^\d{3}$'));
alter table mt_rsdtdsp_blk_pos add constraint mt_rsdtdsp_blk_p_rsdt_addr_flg_ck check (rsdt_addr_flg in ('1','0'));
alter table mt_rsdtdsp_blk_pos add constraint mt_rsdtdsp_blk_p_rsdt_addr_mtd_code_ck check (rsdt_addr_mtd_code in ('1','2','0'));
alter table mt_rsdtdsp_blk_pos add constraint mt_rsdtdsp_blk_p_rep_src_code_ck check (rep_src_code in ('0','1','2','3'));
alter table mt_rsdtdsp_blk_pos add constraint mt_rsdtdsp_blk_p_plygn_src_code_ck check (plygn_src_code in ('0','1'));
alter table mt_rsdtdsp_blk_pos add constraint mt_rsdtdsp_blk_p_pos_data_mnt_year_ck check (regexp_like (pos_data_mnt_year, '^\d{4}$'));
-- rsdtdsp_rsdt_pos
alter table mt_rsdtdsp_rsdt_pos add constraint mt_rsdtdsp_rsdt_p_lg_code_ck check (regexp_like (lg_code, '^\d{6}$'));
alter table mt_rsdtdsp_rsdt_pos add constraint mt_rsdtdsp_rsdt_p_matchiaza_id_ck check (regexp_like (machiaza_id, '^\d{7}$'));
alter table mt_rsdtdsp_rsdt_pos add constraint mt_rsdtdsp_rsdt_p_blk_id_ck check (regexp_like (blk_id, '^\d{3}$'));
alter table mt_rsdtdsp_rsdt_pos add constraint mt_rsdtdsp_rsdt_p_rsdt_id_ck check (regexp_like (rsdt_id, '^\d{3}$'));
alter table mt_rsdtdsp_rsdt_pos add constraint mt_rsdtdsp_rsdt_p_rsdt2_id_ck check (regexp_like (rsdt2_id, '^\d{5}$'));
alter table mt_rsdtdsp_rsdt_pos add constraint mt_rsdtdsp_rsdt_p_rsdt_addr_flg_ck check (rsdt_addr_flg in ('1','0'));
alter table mt_rsdtdsp_rsdt_pos add constraint mt_rsdtdsp_rsdt_p_rsdt_addr_mtd_code_ck check (rsdt_addr_mtd_code in ('1','2','0'));
alter table mt_rsdtdsp_rsdt_pos add constraint mt_rsdtdsp_rsdt_p_rep_src_code_ck check (rep_src_code in ('0','1','2','3'));
alter table mt_rsdtdsp_rsdt_pos add constraint mt_rsdtdsp_rsdt_p_basic_rsdt_div_ck check (basic_rsdt_div in ('0','1'));
SQLワークショップSQLスクリプトとして実行します。確認画面が開くので、即時実行をクリックします。


スクリプトが実行されます。エラーがないことを確認します。


これより、データのインポート作業を行います。

データのインポートにあたって、以下の作業をすべてのデータセットに対して繰り返します。
  1. デジタル庁が提供しているレジストリカタログより、インポートするデータセットを見つけてダウンロードします。
  2. ダウンロードしたZIPファイルを展開し、CSVを取り出します。
  3. APEXアプリケーションで共有コンポーネントデータ・ロード定義を作成します。データ・ロード定義を作成するにあたって、ダウンロードしたCSVを使用します。
  4. 作成したデータ・ロード定義を主に、データをロードするページを作成します。
  5. 作成したページを実行し、ダウンロードしたデータセットのCSVをインポートします。
上記の作業を、都道府県市区町村町字地番住居表示-街区住居表示-住居町字フルセット都道府県位置参照市区町村位置参照町字位置参照地番位置参照住居表示-街区位置参照住居表示-住居位置参照を対象として、都合13回繰り返します。

都道府県から始めます。デジタル庁のレジストリカタログのサイトを開きます。

都道府県マスターのデータセットを検索し、日本 都道府県マスター データセットをダウンロードします。


ダウンロードしたmt_pref_all.csv.zipを解凍し、mt_pref_all.csvを取り出します。

共有コンポーネントデータ・ロード定義を開きます。


作成をクリックします。


データ・ロードの作成最初からです。

へ進みます。


データ・ロード定義の名前PREFとします。表名MT_PREFを選択します。

へ進みます。


サンプル・ファイルとして、レジストリ・カタログからダウンロードしたmt_pref_all.csvを選択します。

へ進みます。


インポートする表の定義は、アドレス・ベース・レジストリの定義を元にしているため、CSVのソース列と表のマップ先は自動的に一致します。

ファイル・エンコーディングUnicode(UTF-8)に変更します。列ABLT_DATE廃止日)にはデータが含まれていないため、書式マスクにデフォルト値が設定されません。列EFCT_DATEと同じになるよう、YYYY"-"MM-"-"DDを設定します。

表に設定している一意制約に含まれている列を、主キーとしてチェックを入れます。表MT_PREFについては列LG_CODEが一意制約の対象となっています。

以上の設定を行い、データ・ロードの作成をクリックします。


データ・ロード定義PREFが作成されます。


作成されたデータ・ロード定義PREFを開きます。

今回はCSVのデータを、データ交換のためにインターフェース表にロードします。そのため、設定ロード・メソッド追加に変更します。

変更の適用をクリックします。


作成したデータ・ロード定義を元に、データをロードするページを作成します。

ページの作成をクリックします。


データのロードを選択します。


データ・ロード属性データ・ロードPREFを選択します。ページの名前は選択するデータ・ロード定義に合わせて、Load PREFとします。

最大ファイル・サイズ(MB)はデフォルトの5から変更不要です。都道府県のデータは少ないためです。他のデータ、例えば町字マスターなどは全部で162MB程度あるため、最大ファイル・サイズ(MB)に、大きな値を設定する必要があります。

ナビゲーションはデフォルトから変更せず、ナビゲーションブレッドクラムの双方を作成します。

以上の設定で、ページの作成をクリックします。


データをロードするページが作成されます。

ページを実行し、データをロードします。


Load PERFにて、ファイルの選択をクリックします。


ファイルがアップロードされ、内容がプレビューされます。

データのロードをクリックします。


データのロードが完了し、ロードされた行数がメッセージに表示されます。


データベースにロードされたデータは、ナビゲーション・メニューのPerfから開く、表MT_PERFの対話モード・レポートより確認できます。


以上で、都道府県マスターのデータ・ロード作業は完了です。

次に市区町村マスターをデータベースにロードします。日本 市区町村マスター データセットをダンロードします。インポートするファイルはmt_city_all.csvです。


作成するデータ・ロード定義の名前CITYとします。ターゲットの表名MT_CITYです。続く画面で、サンプル・データとしてmt_city_all.csvを選択します。


都道府県マスターの設定と同様に、ファイル・エンコーディングUnicode(UTF-8)として、一意制約に含まれている列(市区町村マスターでは列LG_CODEのみ)の主キーにチェックを入れます。列ABLT_DATE書式マスクYYYY"-"MM"-"DDを設定します。

以上で、データ・ロードの作成をクリックします。


作成されたデータ・ロード定義CITYの設定のロード・メソッド追加に変更します。


作成したデータ・ロード定義CITYを元に、データをロードするページを作成します。

ページの名前Load CITYデータ・ロードとしてCITYを選択します。


作成したページLoad CITYを実行し、ファイルmt_city_all.csvをアップロードします。

プレビューを確認し、データのロードを実行します。


MT_CITYにロードされたmt_city_all.csvの内容は、ナビゲーション・メニューのCityの対話モード・レポートから確認できます。


町字マスターのデータをロードします。日本 町字マスター データセットをダウンロードします。インポート対象となるファイルはmt_town_all.csvです。


作成するデータ・ロード定義の名前TOWNとします。ターゲットの表名MT_TOWNです。続く画面で、サンプル・データとしてmt_town_all.csvを選択します。


ファイル・エンコーディングUnicode(UTF-8)への変更、主キーの設定(町字マスターでは列LG_CODEMACHIAZA_IDRSDT_ADDR_FLGEFCT_DATE)、ABLT_DATEの書式マスクYYYY"-"MM"-"DDの設定を行います。

データ・ロード定義が作成された後に、ロード・メソッド追加に変更します。


町字マスターをロードするページの名前Load TOWNとします。データ・ロードとしてTOWNを選択します。

町字マスターはデータ量が多いため、最大ファイル・サイズ(MB)200を設定します。


町字マスターはデータ量が多く、そのままデータ・ロードを行うと、ロード中にタイムアウトが発生します。そのため、データ・ロードをバックグラウンドで処理する必要があります。

作成されたデータ・ロードのページのプロセス・ビューを表示します。

新たにプロセスを作成します。

識別名前バックグラウンド処理タイプ実行チェーンを選択します。

設定バックグラウンド実行オンにします。一時ファイル処理移動一時ファイル・アイテムとしてP30_FILE(ページ番号が異なる場合は、数値の部分が変わります。タイプファイルのアップロードであるページ・アイテムを指定します)、実行限度とします。

実行限度は同一セッション内での制限になります。他のセッションから実行されることも考慮し、シリアライズオンすでに実行時エラーを指定します。

サーバー側の条件ボタン押下時LOADを指定します。


プロセスデータのロードを選択します。

識別実行チェーンとしてバックグラウンド処理を選択します。設定ファイル参照アイテムの値が、実行チェーンに設定した一時ファイル・アイテムの値と一致していることを確認します。

サーバー側の条件ボタン押下時をLOADから、無指定(- 選択 -)に戻します。サーバー側の条件は、実行チェーンに設定されています。


以上でデータ・ロードがバックグラウンドで実行されるようになりました。

ページを実行し、町字マスターのデータをロードしてみます。

Load TOWNを開き、アップロードするファイルとしてmt_town_all.csvを選択します。

時間がかかりますが、最終的にプレビューが表示されます。

データのロードをクリックします。


データのロードはバックグランドで実行されるため、データのロードをクリックした後に、アプリケーションは待機せずに操作可能になります。


データ・ロードの進捗を確認します。

ナビゲーション・メニューのTownを開き、対話モード・レポートのアクションからグループ化を選択します。

グループ化の対象列としてPerf(都道府県名)を選択します。ファンクションカウントを選択し、合計オンにします。都道府県ごとの件数と全体の件数を、対話モード・レポートに表示します。


都道府県ごとの町字のロード件数と、全体のロード件数が対話モード・レポートに表示されます。ページを再ロードすることにより、ロード件数が更新されます。データ・ロード定義のコミット間隔として200(デフォルト値)が設定されているため、200件ごとに表示が更新されます。


2024年6月時点でのmt_town_all.csvには、770209件の町字が含まれています。バックグラウンドで処理を行っているためタイムアウトは発生しませんが、すべてのデータをロードするのに2時間程度の時間がかかります。

Oracle APEXのデータ・インポートは、インポート時にルックアップ・テーブルをみて、ID値に置き換えたり、正規表現を適用して値を整形したりといった処理ができる反面、PL/SQLだけで実装しているため処理は速くありません。今回のように、CSVのデータをそのまま変更せずにデータベースにロードするケースでは、Oracle Databaseの外部表を使ったり、DBMS_CLOUD.COPY_DATAを使うといった方法、データベース・アクションを使うといった方法の検討もお勧めします。

これ以外のマスター・データに対する作業も、手順としては同じです。地番、住居表示-街区、住居表示-住居のマスターは町字よりもはるかにデータ量が多いため、全体を一度に取り込むことは、APEXのアプリケーションではほぼ出来ません。

データ・ロード定義およびアプリケーションの作成を完了させるために、データは世田谷区(市区町村で限定すればよく、世田谷区以外でも構いません)に限定して作業を進めます。

東京都 世田谷区 地番マスター データセットをダウンロードします。ロード対象のファイルはmt_parcel_city131121.csvになります。


データ・ロード定義の名前PARCELとします。ターゲットの表名MT_PARCELです。


主キーとして列LG_CODEMACHIAZA_IDPRC_IDPRC_NUM1RSDT_ADDR_FLGEFCT_DATEをチェックします。それ以外は他と同じです。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load PARCELデータ・ロードPARCELを選択します。最大ファイル・サイズ(MB)100とします。

ページが作成された後、町字マスターをロードするページと同様に、データのロードをバックグラウンドで処理するように、実行チェーンの作成を行います。手順はほぼ同じなので、省略します。


以上で地番のマスター・データをロードするページができます。

作成したページより、データ・ロード定義の作成に使用したファイルmt_parcel_city131121.csvをロードします。


ロードした結果はナビゲーション・メニューのParcelから開く、対話モード・レポートで確認できます。


東京都 世田谷区 住居表示-街区マスター データセットをダウンロードします。ロード対象のファイルはmt_rsdtdsp_blk_city131121.csvになります。


データ・ロード定義の名前RSDTDSP_BLK、ターゲットの表名MT_RSDTDSP_BLKです。


主キーとして列LG_CODEMACHIAZA_IDBLK_IDRSDT_ADDR_FLGEFCT_DATEをチェックします。それ以外は他と同じです。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load RSDTDSP_BLKデータ・ロードRSDTDSP_BLKを選択します。最大ファイル・サイズ(MB)5のまま、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのRsdtdsp Blkの対話モード・レポートのページより、ロードされたデータを確認します。


東京都 世田谷区 住居表示-住居マスター データセットをダウンロードします。ロード対象のファイルはmt_rsdtdsp_rsdt_city131121.csvになります。


データ・ロード定義の名前RSDTDSP_RSDT、ターゲットの表名MT_RSDTDSP_RSDTです。


主キーはチェックしません(下のスクリーンショットではチェックが入っていますが、外します)。それ以外は他と同じです。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load RSDTDSP_RSDTデータ・ロードRSDTDSP_RSDTを選択します。最大ファイル・サイズ(MB)20とし、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのRsdtdsp Rsdtの対話モード・レポートのページより、ロードされたデータを確認します。


町字マスター(フルセット)のデータをロードします。日本 町字マスター(フルセット) データセットをダウンロードします。インポート対象となるファイルはmt_town_fullset_all.csvです。

町字マスター(フルセット)は、町字マスターより多くの列が定義されていますが、データ自体は、町字マスターとそれほど違いはありません。

作業手順や設定は町字マスターと同じです。そのため、手順の記載は省略します。作成するデータ・ロード定義の名前TOWN_FULLSET、データをロードするページの名前はLoad TOWN_FULLSETとします。


日本 都道府県マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_pref_pos_all.csvになります。


データ・ロード定義の名前PREF_POS、ターゲットの表名MT_PREF_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更します。主キーとして列LG_CODEをチェックします。位置参照拡張は履歴を含まないため、効力発生日および廃止日は含みません。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load PREF_POSデータ・ロードPREF_POSを選択します。最大ファイル・サイズ(MB)5のまま変更せず、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのPref Posの対話モード・レポートのページより、ロードされたデータを確認します。


日本 市区町村マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_city_pos_all.csvになります。


データ・ロード定義の名前CITY_POS、ターゲットの表名MT_CITY_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更し、主キーとして列LG_CODEをチェックします。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load CITY_POSデータ・ロードCITY_POSを選択します。最大ファイル・サイズ(MB)5のまま変更せず、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのCity Posの対話モード・レポートのページより、ロードされたデータを確認します。


全国 町字マスター位置参照拡張 データセットをダウンロードします。

全国 町字マスター位置参照拡張のデータはmt_town_pos_all.csv.zipとしてダウロードされます。このZIPファイルにはmt_town_pos_pref01.csv.zipからmt_town_pos_pref47.csv.zipまで、47都道府県ごとに分割されたファイルが含まれています。

今回はこの中のmt_town_pos_pref13.csv.zip(つまり東京都)を解凍したmt_town_pos_pref13.csvをロード対象とします。


データ・ロード定義の名前TOWN_POS、ターゲットの表名MT_TOWN_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更し、主キーとして列LG_CODEMACHIAZA_IDRSDT_ADDR_FLGをチェックします。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load TOWN_POSデータ・ロードTOWN_POSを選択します。最大ファイル・サイズ(MB)5のまま変更せず、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのTown Posの対話モード・レポートのページより、ロードされたデータを確認します。


世田谷区 地番マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_parcel_pos_city131121.csvになります。


データ・ロード定義の名前PARCEL_POS、ターゲットの表名MT_PARCEL_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更し、主キーとして列LG_CODEMACHIAZA_IDPRC_IDをチェックします。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load PARCEL_POSデータ・ロードPARCEL_POSを選択します。最大ファイル・サイズ(MB)5のまま変更せず、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのParcel Posの対話モード・レポートのページより、ロードされたデータを確認します。


世田谷区 住居表示-街区マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_rsdtdsp_blk_pos_city131121.csvになります。


データ・ロード定義の名前PARCEL_POS、ターゲットの表名MT_PARCEL_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更し、主キーとして列LG_CODEMACHIAZA_IDBLK_IDREP_LONREP_LATをチェックします。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load RSDTDSP_BLK_POSデータ・ロードRSDTDSP_BLK_POSを選択します。最大ファイル・サイズ(MB)5のまま変更せず、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのRsdtdsp Blk Posの対話モード・レポートのページより、ロードされたデータを確認します。


世田谷区 住居表示-住居マスター位置参照拡張 データセットをダウンロードします。ロード対象のファイルはmt_rsdtdsp_rsdt_pos_city131121.csvになります。


データ・ロード定義の名前RSDTDSP_RSDT_POS、ターゲットの表名MT_RSDTDSP_RSDT_POSです。


ファイル・エンコーディングUnicode(UTF-8)に変更し、主キーとして列LG_CODEMACHIAZA_IDBLK_IDRSDT_IDREP_LONREP_LATをチェックします。

データ・ロード定義の作成後、ロード・メソッド追加に変更します。


データをロードするページを作成します。名前Load RSDTDSP_RSDT_POSデータ・ロードRSDTDSP_RSDT_POSを選択します。最大ファイル・サイズ(MB)50に変更しますが、バックグラウンド処理の設定は省略します。


作成されたページよりデータをロードした後、ナビゲーション・メニューのRsdtdsp Rsdt Posの対話モード・レポートのページより、ロードされたデータを確認します。


以上で、デジタル庁によって整備されている以下のアドレス・ベース・レジストリをデータベースにロードし、参照するAPEXアプリケーションが作成できました。
  1. 都道府県マスター
  2. 市区町村マスター
  3. 町字マスター
  4. 地番マスター
  5. 住居表示-街区マスター
  6. 住居表示-住居マスター
  7. 町字マスター(フルセット)
  8. 都道府県マスター位置参照拡張
  9. 市区町村マスター位置参照拡張
  10. 町字マスター位置参照拡張
  11. 地番マスター位置参照拡張
  12. 住居表示-街区マスター位置参照拡張
  13. 住居表示-住居マスター位置参照拡張
最後に、アプリケーションにもうひとつ、ページを追加します。インポート対象のファイルがどのマスターに当たるかは、ファイル名から判断できます。

ファイル名から使用するデータ・ロード定義を決めて、データのロードを実行するページを作成します。

以下のようなページになります。ファイルを選択するページ・アイテムとアップロードするボタンだけの簡単なページです。


空白ページを作成して、機能を実装します。

ページ・アイテムの識別名前P41_FILESタイプファイルのアップロードです。ラベルはFilesとします。

ストレージタイプ表APEX_APPLICATION_TEMP_FILESファイルをパージするタイミングセッションの終わりを指定します。

複数ファイルの許可オフにします。

データ・ロードの処理自体は、複数ファイルを指定しても動くように実装していますが、現行バージョンのOracle APEXは、複数のファイルは実行チェーンの一時ファイル処理の対象にならず、バックグラウンド処理へ一時ファイルが移動またはコピーされない、という不具合があります。24.1で修正される予定です。


ボタンLOADは、クリックするとページを送信する、一般的なボタンです。


ボタンLOADをクリックしたときに実行されるプロセスを作成します。

データのロードをバックグラウンドで処理するために、実行チェーンを作成します。設定内容は、今までの作業で作成した実行チェーンと同じです。


アップロードされたファイルをデータベースにロードするプロセスを作成します。

識別名前Load ZIPタイプコードを実行とします。実行チェーンバックグラウンド処理を指定します。

ソースPL/SQLコードとして以下を記述します。

declare
/**
* CSVファイル名から、データ・ロードに使うデータ・ロード定義を見つける。
*/
function get_load_def_from_file_name(
p_file_name in varchar2
) return varchar2
as
begin
if p_file_name like 'mt_pref_pos_%.csv' then
return 'pref_pos';
elsif p_file_name like 'mt_pref_%.csv' then
return 'pref';
elsif p_file_name like 'mt_city_pos_%.csv' then
return 'city_pos';
elsif p_file_name like 'mt_city_%.csv' then
return 'city';
elsif p_file_name like 'mt_town_pos_%.csv' then
return 'town_pos';
elsif p_file_name like 'mt_town_fullset_%.csv' then
return 'town_fullset';
elsif p_file_name like 'mt_town_%.csv' then
return 'town';
elsif p_file_name like 'mt_parcel_pos_%.csv' then
return 'parcel_pos';
elsif p_file_name like 'mt_parcel_%.csv' then
return 'parcel';
elsif p_file_name like 'mt_rsdtdsp_blk_pos_%.csv' then
return 'rsdtdsp_blk_pos';
elsif p_file_name like 'mt_rsdtdsp_blk_%.csv' then
return 'rsdtdsp_blk';
elsif p_file_name like 'mt_rsdtdsp_rsdt_pos_%.csv' then
return 'rsdtdsp_rsdt_pos';
elsif p_file_name like 'mt_rsdtdsp_rsdt_%.csv' then
return 'rsdtdsp_rsdt';
end if;
return null;
end get_load_def_from_file_name;
/**
* 指定されたファイルがCSVであれば、データ・ロードを実行する。
* ZIPファイルの場合は内容を解凍し、含まれているファイルそれぞれに対して
* 自分自身を再帰的に呼び出す。
*/
procedure extract_zip_or_append(
p_file_name in varchar2
,p_file_content in blob
)
is
l_files apex_zip.t_files;
l_file_name apex_application_temp_files.filename%type;
l_file_content blob;
l_static_id varchar2(40);
l_load_result apex_data_loading.t_data_load_result;
begin
if apex_string_util.get_file_extension(p_file_name) = 'zip' then
/* extract zip recursively */
apex_debug.info('extract %s', p_file_name);
l_files := apex_zip.get_files(
p_zipped_blob => p_file_content
);
for i in 1 .. l_files.count
loop
l_file_name := l_files(i);
l_file_content := apex_zip.get_file_content(
p_zipped_blob => p_file_content
,p_file_name => l_file_name
);
extract_zip_or_append(
p_file_name => l_file_name
,p_file_content => l_file_content
);
end loop;
else
/* load CSV into database. */
l_static_id := get_load_def_from_file_name(
p_file_name => p_file_name
);
if l_static_id is null then
apex_debug.info('Skip loading %s', p_file_name);
return;
end if;
apex_debug.info('Start loading %s by %s, length %s', p_file_name, l_static_id,
dbms_lob.getlength(p_file_content));
l_load_result := apex_data_loading.load_data(
p_static_id => l_static_id
,p_data_to_load => p_file_content
);
apex_debug.info('End loading %s, rows %s', p_file_name, l_load_result.processed_rows);
end if;
end extract_zip_or_append;
/**
* アップロードされたファイルをデータベースにロードする。
*/
begin
apex_debug.info('Selected files: %s', :P41_FILES);
for r in (
select filename, mime_type, blob_content
from apex_application_temp_files where name in
(select column_value from apex_string.split(:P41_FILES, ':'))
)
loop
apex_debug.info('Process file %s', r.filename);
extract_zip_or_append(
p_file_name => r.filename
,p_file_content => r.blob_content
);
end loop;
end;


アップロードした住所・所在地データのファイルがZIPであれば、ZIPを解凍して含まれているCSVファイルをデータベースにロードします。

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

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