Top / DB関連 / Oracleで郵便番号DBの作成(Linux編)

Oracleで郵便番号DBの作成(Linux編)

ネットで調べると、MySQLやPostgreSQLでの郵便番号DBの作成の記事は記載がありますが、
Oracle上でそういった記事は、あまり無かったりします。
というわけで作成してみます。

テーブルの作成

まずは郵便番号データを格納するテンポラリテーブルを作成します。
で、以下のDDLを流します。
コメントについては、不要だとおもったら消してください。

サイズについては、現時点での郵便番号データの長さを確認し、データが入る長さにしています。
無駄に長くなっていませんのでご安心ください。

CREATE TABLE ZIP_TMP 
    ( 
     zip_code CHAR (7 BYTE)  NOT NULL , 
     zip_old CHAR (5 BYTE)  NOT NULL , 
     jiscode NUMBER (5)  NOT NULL , 
     pref_kana VARCHAR2 (10 CHAR)  NOT NULL , 
     city_kana VARCHAR2 (25 CHAR)  NOT NULL , 
     area_kana VARCHAR2 (75 CHAR)  NOT NULL , 
     pref_kan VARCHAR2 (4 CHAR)  NOT NULL , 
     city_kan VARCHAR2 (15 CHAR)  NOT NULL , 
     area_kan VARCHAR2 (40 CHAR)  NOT NULL , 
     flg1 NUMBER (1)  NOT NULL , 
     flg2 NUMBER (1)  NOT NULL , 
     flg3 NUMBER (1)  NOT NULL , 
     flg4 NUMBER (1)  NOT NULL , 
     flg5 NUMBER (1)  NOT NULL , 
     flg6 NUMBER (1)  NOT NULL 
    ) LOGGING 
;
 COMMENT ON TABLE ZIP_TMP IS '郵便番号'
;
 COMMENT ON COLUMN ZIP_TMP.zip_code IS '郵便番号' 
;
 COMMENT ON COLUMN ZIP_TMP.zip_old IS '旧郵便番号' 
;
 COMMENT ON COLUMN ZIP_TMP.jiscode IS '全国地方公共団体コード' 
;
 COMMENT ON COLUMN ZIP_TMP.pref_kana IS '都道府県名(カナ)' 
;
 COMMENT ON COLUMN ZIP_TMP.city_kana IS '市区町村名(カナ)' 
;
 COMMENT ON COLUMN ZIP_TMP.area_kana IS '町域名(カナ)' 
;
 COMMENT ON COLUMN ZIP_TMP.pref_kan IS '都道府県名(漢字)' 
;
 COMMENT ON COLUMN ZIP_TMP.city_kan IS '市区町村名(漢字)' 
;
 COMMENT ON COLUMN ZIP_TMP.area_kan IS '町域名(漢字)' 
;
 COMMENT ON COLUMN ZIP_TMP.flg1 IS '一町域が二以上の郵便番号で表される場合の表示 (注3) (「1」は該当、「0」は該当せず)' 
;
 COMMENT ON COLUMN ZIP_TMP.flg2 IS '小字毎に番地が起番されている町域の表示 (注4) (「1」は該当、「0」は該当せず) ' 
;
 COMMENT ON COLUMN ZIP_TMP.flg3 IS '丁目を有する町域の場合の表示 (「1」は該当、「0」は該当せず) ' 
;
 COMMENT ON COLUMN ZIP_TMP.flg4 IS '一つの郵便番号で二以上の町域を表す場合の表示 (注5) (「1」は該当、「0」は該当せず)' 
;
 COMMENT ON COLUMN ZIP_TMP.flg5 IS '更新の表示(注6)(「0」は変更なし、「1」は変更あり、「2」廃止(廃止データのみ使用))' 
;
 COMMENT ON COLUMN ZIP_TMP.flg6 IS '変更理由 (「0」は変更なし、「1」市政・区政・町政・分区・政令指定都市施行、「2」住居表示の実施、「3」区画整理、「4」郵便区調整等、「5」訂正、「6」廃止(廃止データのみ使用))' 
;
CREATE INDEX ix_ZIP_TMP_01 ON ZIP_TMP 
    ( 
     zip_code ASC 
    ) 
    NOLOGGING 
    NOCOMPRESS 
    NOPARALLEL 
;

SQL Loaderの制御ファイル

以下の制御ファイルを作成します。ちなみにLinuxOS上で動作させるための制御ファイルです。
試してはいませんが、

INFILE 'ken_all.csv' "STR '\r\n'" 
↓
INFILE 'ken_all.csv' 

にすれば、理論上、Windows上でも動作するはずです。

 
LOAD DATA
CHARACTERSET JA16SJIS
INFILE 'ken_all.csv' "STR '\r\n'"
INSERT INTO TABLE ZIP_TMP
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(JISCODE, ZIP_OLD, ZIP_CODE,
 PREF_KANA, CITY_KANA, AREA_KANA,
 PREF_KAN, CITY_KAN, AREA_KAN,
 FLG1, FLG2, FLG3,
 FLG4, FLG5, FLG6)

郵便番号データをダウンロードする

日本郵便から郵便番号CSVデータを以下のコマンドでダウンロードします。

wget http://www.post.japanpost.jp/zipcode/dl/kogaki/lzh/ken_all.lzh

LHAをダウンロードする

日本郵便の郵便番号CSVファイルは、lzh形式なため、lhaをインストールします。
CentOSでは、日本でのデファクトスタンダード(もう過去の話?)であるLHA形式の圧縮ファイルの展開は、
標準ではできません。
以下のコマンドを投入し、ダウンロードとインストールをします。

wget http://packages.sw.be/lha/lha-1.14i-19.2.2.el5.rf.i386.rpm
yum --nogpgcheck install lha-1.14i-19.2.2.el5.rf.i386.rpm
lha e ken_all.lzh

参考

SQLLoaderでDBにインポートする

以下のコマンドを投入し、DBにインポートします。

sqlldr userid=username/password control=zip.ctl

苦労した点

日本郵便が提供する郵便番号データが、Shift-JIS、改行コード:CR+LFなので
これを変換するために、CHARACTERSET JA16SJIS の記述と、
"STR '\r\n'"の記述を入れるのに気付かなかったことです。

 

以上です。

参考資料

最新の10件
2010-07-09 2010-07-08 2010-07-07 2010-06-29 2010-06-28
人気の20件
Counter: 651, today: 3, yesterday: 0

添付ファイル: filezip.ctl 85件 [詳細] filezip_tmp.sql 82件 [詳細]