最初から全ての法令データをロードしようとすると時間がかかるので、憲法のデータを使ってアプリケーションを作成します。アプリケーションが完成したら全ての法令データをデータベースにロードしてみます。
法令分類データの憲法をダウンロードします。1_xml.zipがダウンロードされます。
ダウンロードした1_xml.zipには、法令の一覧が記載されている1.csvというCSVファイルと、法令本文であるXMLファイルがそれぞれ個別のディレクトリの下に含まれています。
ディレクトリ名と法令本文のファイル名は同じで、XMLファイルには.xmlの拡張子が付けられています。例えば法令番号昭和二十一年憲法にあたるファイルは以下です。
321CONSTITUTION_19470503_000000000000000/321CONSTITUTION_19470503_000000000000000.xml
CSVに記載されている一覧の情報と法令本文であるXMLファイルを、以下の表JLAW_DATAに保存します。列BODYとBODY_HASHはXMLファイルの情報なので、CSVファイルには含まれません。列IDは列BODY_URL(CSVでは本文URL)の一部を取り出して割り当てます。
上記の表を作成した後、この表に法令データをロードするAPEXアプリケーションを作成します。
アプリケーション作成ウィザードを起動します。作成するアプリケーションの名前はe-Gov法令とします。デフォルトで追加されているホーム・ページを削除し、代わりに表JLAW_DATAをソースとした対話モード・レポートのページを追加します。
以上でアプリケーションの作成を実行します。
アプリケーションが作成されたら、最初にデータ・ロード定義を作成します。
共有コンポーネントのデータ・ロード定義を開きます。
データ・ロードの作成は最初から行います。
次へ進みます。
次へ進みます。
ソース・タイプはファイルのアップロードとし、サンプル・ファイルとしてダウンロードした法令データに含まれる1.csvを選択します。
次へ進みます。
列見出しの最初の行にヘッダーが含まれるにチェックを入れます。列のマッピングについては、表JLAW_DATAのDDLのコメントにマップ先とソース列の対応が記載されています。
主キー列は後で本文URLからSQL式を用いて生成します。そのため、ここでは主キーにチェックを入れる列はありません。
データ・ロードの作成をクリックします。
データ・ロード定義としてLOAD_CSVが作成されます。これを編集します。
静的IDは大文字および小文字のどちらでもよいのですが、大文字のLOAD_CSVに変更します。ケース・センシティブなので、大文字小文字で異なっていると、別の定義と見做されます。設定のロード・メソッドはマージを選択します。
データ・プロファイルの編集を開きます。
列タイプにSQL式を選択します。名前はIDです。データ型はVARCHAR2、長さは40とします。設定の主キーはオンにします。
ソースのSQL式として以下を記述します。本文URLの引数にlawidとして指定されている値を主キー列IDに設定します。
replace(BODY_URL, 'https://elaws.e-gov.go.jp/document?lawid=')
作成をクリックします。
データ・プロファイルに列IDが追加されました。
変更の適用をクリックします。
以上でデータ・ロード定義LOAD_CSVは完成です。
変更の適用をクリックします。
CSVファイルをロードするページを作成します。
ページ作成ウィザードを開きます。
データのロードを選択します。
ページの名前はCSVのロードとします。データ・ロード属性のデータ・ロードに先ほど作成したLOAD_CSVを選択します。データのアップロード元はファイル、最大ファイル・サイズ(MB)に10を入力します。すべての法令データに含まれるCSVファイルのサイズはほぼ6MBなので、それをロードできるサイズにしています。
ナビゲーションはデフォルトから変更せず、ブレッドクラムとナビゲーションの双方を作成します。
ページの作成をクリックします。
ファイルの選択をクリックし、1.csvを選択します。
ホーム・ページの対話モード・レポートにも、ロードされたデータが一覧されます。
XMLファイルをロードする機能を追加します。
ページ・デザイナでホーム・ページを開きます。
その都度、e-Gov法令のページから法令データをダウンロードするのは手間なので、URLを入力して、ZIPファイルのダウンロードからデータのロードまで一気に行うようにします。
URLを入力するページ・アイテムとしてP1_URLを作成します。識別のタイプはテキスト・フィールド、ラベルはURL、設定のサブタイプとしてURLを選択します。
ラベルはLoad、外観のホットをオンにします。テンプレート・オプションを開き、WidthをStretchに変更します。
動作のアクションはデフォルトのページの送信とし、データのロードはプロセスとして実装します。比較的重い処理が実行されるため、確認の要求をオンにし、確認のメッセージとして法令データをロードしますか?を設定します。
バックグラウンド実行の進捗を確認するため、ビューAPEX_APPL_PAGE_BG_PROC_STATUSを一覧する対話モード・レポートを作成します。
識別のタイトルを進捗とし、ソースのタイプをSQL問合せ、SQL問合せとして以下を記述します。
select * from APEX_APPL_PAGE_BG_PROC_STATUS
実行チェーンに小プロセスを作成します。
プロセス・ビューを開き、法令データをロードするプロセスを作成します。
最初にバックグラウンドで実行するため、実行チェーンを作成します。
プロセスを作成します。識別の名前は法令データのロード、タイプは実行チェーンとします。
設定のバックグラウンドで実行をオンにします。サーバー側の条件のボタン押下時にLOADを指定します。
識別の名前はLoad e-Gov CSV and XML、タイプはコードの実行とし、ソースのPL/SQLコードに以下を記述します。
データベースにロードする法令データのリンクのアドレスをコピーします。
すべての法令データをデータベースにロードするには、大体1時間弱ほどの時間がかかりました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-e-gov-law-loading.zip
今の所、取り込んだXML形式の法令データの使い道は思いつかないのですが、少々複雑な形式のデータをデータベースに取り込む手順の参考になるかと思います。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完