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

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


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

4. プロフィール項目の変更

 項目の変更はリスト4-1のように、「replace」を使います。

xquery 
declare default element namespace "http://myprof.com";
copy $mydoc :=
  db2-fn:sqlquery("SELECT PROFXML FROM PROFXMLATT WHERE HN = 10001")
modify (
  do replace $mydoc/prof/項目[@項目名 = "好きな男性のタイプ"]
    with <項目 項目名="好きな男性のタイプ">やさしい人</項目>
) return $mydoc
リスト4-1 replaceを使った項目の変更

 変更対象がないとエラーになりますので、リスト4-2のようにif文を使って変更対象の項目がないときには新しくインサートするようにしておくとよいでしょう。

xquery 
declare default element namespace "http://myprof.com";
copy $mydoc :=
  db2-fn:sqlquery("SELECT PROFXML FROM PROFXMLATT WHERE HN = 10001")
modify (
  (if ($mydoc/prof/項目[@項目名 = "好きな男性のタイプ"]) then
    do replace $mydoc/prof/項目[@項目名 = "好きな男性のタイプ"]
      with <項目 項目名="好きな男性のタイプ">やさしい人</項目>
  else
    do insert <項目 項目名="好きな男性のタイプ">やさしい人</項目>
      as last into $mydoc/prof)
) return $mydoc
リスト4-2 if文を使ったエラー回避

 また、要素や属性の名前を変更する際には、「rename」を使います。

xquery 
declare default element namespace "http://myprof.com";
copy $mydoc :=
  db2-fn:sqlquery("SELECT PROFXML FROM PROFXMLATT WHERE HN = 10001")
modify 
  for $e in $mydoc/prof/項目
  where $e[@項目名 = "性別"]
  return (do rename $e/@項目名 as "質問内容")
return $mydoc
リスト4-3 要素・属性の名前変更


5. プロフィール項目の削除

 削除の場合には、「delete」を使います。

xquery 
declare default element namespace "http://myprof.com";
copy $mydoc :=
  db2-fn:sqlquery("SELECT PROFXML FROM PROFXMLATT WHERE HN = 10001")
modify do delete $mydoc/prof/項目[@項目名 = "好きな男性のタイプ"]
return $mydoc
リスト5-1 データの削除


6. 複数のプロフィール項目を同時に変更

 リスト6-1のように、複数の項目を同時に変更することも可能です。ここでは「insert」しか利用していませんが、ほかの操作(replace、delete)を組み合わせて利用することもできます。

xquery 
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,
  do insert <項目 項目名="誕生日">1981-06-15</項目>
    as last into $mydoc/prof,
  do insert <項目 項目名="星座">ふたご座</項目>
    as last into $mydoc/prof,
  do insert <項目 項目名="好きな男性のタイプ">クールな人</項目>
    as last into $mydoc/prof
) return $mydoc
リスト6-1 複数項目の同時変更


7. プロフィール項目の順序を変更する

 リスト7-1は、項目の並び順を変更する例です。新しい位置(項目の1番目の次)にデータを挿入し、元の項目を削除しています。

xquery 
declare default element namespace "http://myprof.com";
copy $mydoc :=
  db2-fn:sqlquery("SELECT PROFXML FROM PROFXMLATT WHERE HN = 10001")
modify (
  do insert <項目 項目名="好きな男性のタイプ">やさしい人</項目>
    after $mydoc/prof/項目[1],
  do delete $mydoc/prof/項目[@項目名 = "好きな男性のタイプ"]
) return $mydoc
リスト7-1 挿入と削除を同時に実行する

 このようにXML文書は同じ要素名でも順序を記憶しているので、並び順は持つ必要がありません。このような並び順に関する実装を、MySQLのようなリレーショナル・データベースで行うことを考えると、SQLを作るだけでも非常に大変な作業になることは容易に想像できますね。

  3/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 記事ランキング

本日月間