Viper 2で学ぶXMLデータベース最新事情
Viper 2で学ぶXMLデータベース最新事情(3)

“プロフ”サイトの構築だってXML DBでしょ


日本アイ・ビー・エム
中林 紀彦
2007/12/21

プロフサービスの基本となる機能の実装

 XMLデータを格納するテーブルができたので、次は実際に機能の実装について解説していきましょう。今回はXMLデータベースの話なのでXQueryを中心に解説を進めます。

1. XMLデータの登録

 最初の登録はXQueryではなく、ごく普通のSQL文でXMLデータをインサートします。

INSERT INTO PROFXMLATT VALUES(
10001,
'<prof xmlns="http://myprof.com"><項目 項目名="HN">10001</項目></prof>')
リスト1-1 SQL文で初期データを登録


2. 対象データの検索

 ハンドルネーム(HN)だけのレコードができたので、ここからはXQueryを使ってデータの操作を行っていきます。まず、変更対象となるデータを検索するために、HN(ここでは整数)からXQueryを使って検索します。XML列の項目名という属性を検索条件にしていますが、HNというリレーショナル列(整数列)もあるので通常のSELECT文でも検索可能です。

xquery 
declare default element namespace "http://myprof.com";
for $c in db2-fn:xmlcolumn("PROFXMLATT.PROFXML")
where $c/prof/項目[@項目名 = "HN"] = "10001"
return $c !
リスト2-1 ハンドルネームで絞り込み検索


3. プロフィール項目の追加

 現在のプロフィールにはHNしかないので、いろいろなプロフィールを追加していきますが、この部分が今回のポイントです。XMLデータを更新しますので、「XQuery Update Facility」というXQueryの拡張機能を使います。これに関しては後で詳しく解説します。例では項目に性別のデータを追加しています。

xquery 
declare default element namespace 'http://myprof.com';
transform
copy $mydoc := db2-fn:sqlquery(
  "SELECT PROFXML FROM PROFXMLATT WHERE HN = 10001")
modify do insert <項目 項目名="性別">女性</項目>
  as last into $mydoc/prof
return $mydoc
リスト3-1 XQueryを使ったデータの更新

 これがXMLデータを変更するためのTransform表現です。「Transform」キーワードはオプションなので、以降は省略します。

参考:insert時の場所の指定

項目の追加の場所は、リスト3-1のケースでは最後に挿入されますが、ほかにも下記のように挿入場所の指定が可能です。


insert 要素1 before 要素2 要素1は要素2の直前に同じレベルで挿入される
insert 要素1 after 要素2 要素1は要素2の直後に同じレベルで挿入される
insert 要素1 into要素2 要素1は要素2と同じレベルで挿入されるが、位置は不確定
insert 要素1 as first into要素2 要素1は要素2の子要素として最初に挿入される
insert 要素1 as last into要素2 要素1は要素2の子要素として最後に挿入される

 さて、ここがポイントなのですが、実はリスト3-1のXQueryは取り出された結果セットのXMLデータが変更されているだけで、データベースに格納されているXMLデータは変更されません。リスト3-2のようにUPDATE文でXQueryからの結果でXMLカラムを更新する必要があります。

UPDATE PROFXMLATT SET PROFXML =
xmlquery
('
declare default element namespace "http://myprof.com";
copy $mydoc := db2-fn:sqlquery(
  "SELECT PROFXML FROM PROFXMLATT WHERE HN = 10001")
modify do insert <項目 項目名="性別">女性</項目>
  as last into $mydoc/prof
return $mydoc
')
WHERE HN = 10001
リスト3-2 UPDATE文でXMLカラムを更新

 データの絞り込みをXPathでリスト3-3のように表現することもできます。

UPDATE PROFXMLATT SET PROFXML =
xmlquery
('
declare default element namespace "http://myprof.com";
copy $mydoc :=
  db2-fn:xmlcolumn("PROFXMLATT.PROFXML")/prof[項目/@項目名 = "HN"
  and 項目 = "10001"]/..
modify do insert <項目 項目名="性別">女性</項目>
  as last into $mydoc/prof
return $mydoc
')
WHERE HN = 10001
リスト3-3 XPathでデータを絞り込む例

 DB2 9.5からはもっと簡略化でき、「$PROFXML(カラム名)」と書くだけです。

UPDATE PROFXMLATT SET PROFXML =
xmlquery
('
declare default element namespace "http://myprof.com";
copy $mydoc := $PROFXML
modify do insert <項目 項目名="性別">女性</項目>
  as last into $mydoc/prof
return $mydoc
')
WHERE HN = 10001
リスト3-4 DB2 9.5で$PROFXMLを使った構文

 UPDATE文を使ったときの注意点としては、文書ノード(ルート・ノード)を指定する必要があるのと、WHERE条件を必ず指定することです。UPDATE文でWHERE条件がないとすべての列を更新する可能性があるので要注意です。リスト3-2、リスト3-3、リスト3-4では、WHERE条件がないとすべての列が更新されてしまいます。これ以降、UPDATE文は省略してXQueryのみを記載します。

  2/4

 Index
連載:Viper 2で学ぶXMLデータベース最新事情(3)
 “プロフ”サイトの構築だってXML DBでしょ
  Page 1
・どのサービスよりも高機能で柔軟な“プロフ”サイト
Page 2
・プロフサービスの基本となる機能の実装
 1. XMLデータの登録
 2. 対象データの検索
 3. プロフィール項目の追加
  Page 3
 4. プロフィール項目の変更
 5. プロフィール項目の削除
 6. 複数のプロフィール項目を同時に変更
 7. プロフィール項目の順序を変更する
  Page 4
・「XQuery Update Facility」とは?
・XMLデータベースならではのひと味もふた味も違う機能


Viper 2で学ぶXMLデータベース最新事情



Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間