2007/03/23
MAGIC + DB2 で XQuery(3)
インポート・ユーティリティ
前回まででSQLデータベースに表ができたので、今回は実際にXMLファイルを取り込んでみます。
まず、テーブルにレコードを挿入する方法ですが、次の2通りの方法があります。
最初の方法は、SQL文の「insert」命令です。
insert into テーブル名 values(カラム1,カラム2,...,カラムN)
しかし、XMLタイプの項目の場合、その内容を全て記述してあげないといけないのでちょっと大変です。
(例えば、
'<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Application>
<Header>
...略
</Application>'
のように・・・。)
もう一つの方法は「importユーティリティ」を使うものです。
こちらはファイルイメージのXMLファイルを、一括して取り込むことができるので、より便利な方法と言えるでしょう。
import from delファイル of del xml from XMLパス replace into テーブル名ここで、「delファイル」とあるのは、読み込みデータを記述した、いわゆるCSV形式ファイルです。このファイルは、各項目をカンマで区切って記述します。例えば、数値項目なら「100」、文字項目なら「"abc"」、XMLタイプの項目は、「"<xds fil='XMLファイル名' />"」のように記述します。
このとき「XMLファイル名」にはパス名をつけなくて良く、ファイルの格納されたパスは上記のコマンドラインの「XMLパス」で指定します。(「delファイル」も、「XMLパス」もコマンドを実行しているディレクトリからの相対パスでもOK)
「replace」は動作を表すオプションで、テーブル内のレコードは読み込む前に全てdropされます。残したまま追加読み込みさせたいなら「insert」を指定します。
インポート用delファイル書き出しプログラム
プロジェクトフォルダにデータ読み込み用の「inport_prg.del」というファイルを書き出すプログラムを作成してみます。
プログラムの一覧は、プロジェクトフォルダを自動的に検知し、メモリテーブルの「Progs.ProgNo」に作成されていますから、それをテキスト形式のファイルに書き出すだけです。
プログラムの作成手順を下記に示します。
- プログラムの追加
プログラムを追加して「delファイル出力」と名前をつけます。
タスク特性は「B=バッチ」に指定します。 - データビュー
メインソースは「4」の「Progs.ProgNo」を選択します。インデックスは何を選んでも構いませんが、表示順を見るために「2」の「ProgNo.」を選択します。
カラムには、「1」の「id」を追加します。
変数「出力イメージ」、文字タイプの書式「80」を追加します。代入に下記の式を追加します。プログラムのソースを表す「PRG」にidの5桁を加えたものを主項目にセットします。'"PRG'&Str(B,'5P0')&'","<xds fil=''Prg_'
&Trim(Str(B,'5'))&'.xml'' />"' - フォームの追加
クラス1の「T=テキスト形式」フォームを追加します。幅「80.000」、高さ「1.000」とし、変数「出力イメージ」を配置します。 - 入出力ファイルの定義
メディア:「F=ファイル」、アクセス:「W=書出」の名前「delファイル」を定義します。式には「'%Project%\inport_prg.del'」を指定します。 - ロジックの定義
レコード後処理に、フォーム出力を定義します。
「プログラム一覧」からの起動メニューを組み込む
ちょっと話題はズレますが、実は、前回ソース公開したプログラムには、プロジェクトフォルダを自由に選択できるような機能が組み込まれています。
#2のプログラム「プログラム一覧」を単独で実行して頂くと、コンテキスト・メニューの「プロジェクトフォルダの選択」から、任意のフォルダを選択することのできるダイアログを起動します。

更に蛇足ですが、このフォルダ選択プログラム(#8「プロジェクトの選択(A)」)では、V10になって新しく実装された関数「DirDlg」を使用しています。
DirDlg ('プロジェクトの選択','プロジェクトフォルダを選択して下さい.',C,0) 上記の式中、変数「C」には初期フォルダをセットしているのですが、前回ご紹介させて頂いた論理名「%WorkingDir%」を展開し、現在のプロジェクトフォルダを取得して初期値としています。さて、「プログラム一覧」のコンテキストメニューに、今回作成した「delファイル出力」を組み込んでみたいと思います。簡単な手順を示しておきます。
- メインプログラムへのイベント定義
メインプログラムを開き、イベントテーブル(「Ctrl+U」キー)に「delファイル出力」を追加します。 - メニューの修正
メニューリポジトリを開き、#3「プログラム一覧(有効プログラム)」と#4「プログラム一覧」にイベント「delファイル出力」を追加します。 - プログラム#2「プログラム一覧」の修正
プログラム#2「プログラム一覧」を開き、タスク「2.1」を開きます。
ロジックテーブルに、イベント「delファイル出力」を追加します。
追加したイベントにコールプログラム#9と、OSコマンド「'notepad '&Translate('%Project%\inport_prg.del')」の定義を追加します。 - プログラムの実行
プログラム#2「プログラム一覧」を実行します。
コンテキストメニューから「プロジェクトフォルダの選択」を起動し、任意のプロジェクトフォルダを選択してみて下さい。(リスト内容が切り替わると思います。)
更に、「delファイル出力」を実行します。メモ帳に出力されたdelファイルの内容が出力されます。
importユーティリティの実行
さていよいよXMLデータベース(DB2 9)へのXMLのインポートです。
とりあえず、今回もコマンドラインプロセッサーを使いましょう。
スタートメニューから「コマンド・ウインドウ」を起動します。
カレントディレクトリをリストを出力したプロジェクトフォルダに切り替え、下記のコマンドを入力してみて下さい。(大文字でも小文字でもOKです。)
IMPORT FROM INPORT_PRG.DEL OF DEL XML FROM SOURCE REPLACE
INTO DB2ADMIN.XMLDBTEST

このユーティリティですが、入力時には結構、厳しくXMLデータの内容のチェックをしているようで、XML中に使ってはいけないとされる半角カナなどの文字があると取り込みを拒否してしまいます。
(MAGICのソースはエラーとなるようなことはありません。)
また、大規模なXMLファイルを読み込むような場合は、いろいろと注意が必要です。
例えば、タグ内の文字列のサイズは最大で32000バイトです。これを超えるとこのタグの内容は検索することができなくなるので注意が必要です。複数のタグに分割する分にはOKです。
他にも大量のレコード(何万件)を読み込む場合は幾分の設定の変更が必要になります。
さて、読み込んだデータを確認してみましょう。
MAGICでテーブルをAPGで開いてもそれなりの確認はできますが、ここではDB2のGUIユーティリティ「コントロールセンター」を使ってみます。起動すると下記のような画面が表示されます。

オブジェクトビューから作成した表「XMLDBTEST」を表示します。
アクションから「オープン」すると内容の確認が可能です。

XMLの内容を見てみましょう。任意のレコードで「・・・」と書かれたボタンをクリックすると文書ビュアーが起動します。取り込まれたXMLドキュメントの内容の確認が可能です。

次回は、いよいよXMLデータベースの検索に挑戦です!
