首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 SQL 與 XQuery 教程(七):pureXML 與 XQuery 入門實戰

     編輯:DB2 教學

XML 與 pureXML 概述

DB2 9 作為業界首個混合數據服務器,在關系引擎基礎上引入優化 XML 存儲引擎,原生支持 XML 文檔存儲、索引、事務、安全與 XQuery 查詢。XML 特點:自描述(標記與數據共存)、層次化(體現實體關系)、序列化(順序敏感),與關系模型(集合、扁平、靜態模式)互補。

適用 XML 的場景

  • 模式頻繁變更(敏捷性)
  • 數據天然層次化(如基因組、業務對象聚合)
  • 稀疏屬性(商品編目)
  • 少量高結構化關鍵信息(減少關系對象維護)
  • 審計/合規要求保留原始格式

創建 XML 就緒數據庫

-- CLP
db2 create db aromadb using codeset utf-8 territory us
-- Control Center: 勾選 "Enable database for XML",Code set 選 UTF-8

注意:XML 僅支持 UTF-8 單分區數據庫。

Aroma 示例:Comments 列

SALES.COMMENTS 列存儲客戶反饋 XML:評論 ID、客戶信息、反饋類型/內容、評分、商店響應。示例片段:

<Comments>
  <comment>
    <comment_ID>5301</comment_ID>
    <customer_info><fname>Scott</fname><lname>Phillips</lname><email>Scott_Phillips@hotmail.com</email></customer_info>
    <feedback><type>opinion</type><content>Gold Tips was highly enjoyable!</content></feedback>
    <store_rating><score>5</score><out_of>5</out_of></store_rating>
    <store_response><required>no</required></store_response>
  </comment>
  ...
</Comments>

XQuery 基礎與兩類表達式

FLWOR 表達式:類似 SQL SELECT-FROM-WHERE,迭代序列並可選返回計算值。子句關鍵字:for(迭代綁定)、let(變量賦值)、where(過濾)、order by(排序)、return(結果構造)。

路徑表達式:斜槓分隔步驟導航層次,每步可帶謂詞過濾。如 $comments/comment/feedback[type="suggestion"]/content。

執行 XQuery 須在語句首加 xquery 關鍵字(僅頂層語言需加,嵌入 SQL 時不需)。數據源函數 db2-fn:XMLcolumn('SCHEMA.TABLE.COLUMN') 返回列中 XML 文檔序列(名稱需大寫匹配目錄)。

核心查詢模式實戰

1. 檢索 XML 元素

-- FLWOR
xquery for $y in db2-fn:XMLcolumn('AROMA.SALES.COMMENTS') return $y
-- 路徑
xquery db2-fn:XMLcolumn('AROMA.SALES.COMMENTS')

2. 檢索特定元素(如反饋內容)

xquery db2-fn:XMLcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback/content

3. 提取文本值 text()

xquery db2-fn:XMLcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback/content/text()

4. 依元素值過濾(建議類反饋)

-- FLWOR where
xquery for $y in db2-fn:XMLcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback
       where $y/type = "suggestion"
       return $y/content/text()
-- 路徑謂詞
xquery db2-fn:XMLcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback[type="suggestion"]/content/text()

邏輯操作符 or/and 同 SQL。

5. 轉換輸出為 HTML

xquery
<ul> {
  for $y in db2-fn:XMLcolumn('AROMA.SALES.COMMENTS')/Comments/comment/store_response
  where $y/completed = "no"
  return <li>{$y/action/text()}</li>
} </ul>

花括號 {...} 指示計算表達式而非字面量;構造器直接生成目標 XML/HTML。

6. 條件構造 if-then-else

xquery for $y in db2-fn:XMLcolumn('AROMA.SALES.COMMENTS')/Comments/comment
where $y/store_response/completed = "no"
return
  if ($y/feedback/type = 'suggestion')
  then <suggestion>{$y/comment_ID, $y/customer_info, $y/store_response/action}</suggestion>
  else <question>{$y/comment_ID, $y/customer_info, $y/store_response/action}</question>

大小寫敏感:元素名須精確匹配(如 comment_ID)。

7. 排序 order by

xquery for $y in db2-fn:XMLcolumn('AROMA.SALES.COMMENTS')/Comments/comment
where $y/feedback/type = "opinion"
order by $y/store_rating/score
return <comment><rating>{$y/store_rating/score/text()}</rating><opinion>{$y/feedback/content/text()}</opinion></comment>

8. 分組統計 let + distinct-values + count()

xquery for $t in distinct-values(db2-fn:XMLcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback/type)
let $tc := db2-fn:XMLcolumn('AROMA.SALES.COMMENTS')/Comments/comment[feedback/type = $t]
return <comments><type>{$t}</type><count>{count($tc)}</count></comments>

結果:opinion 1220、question 364、suggestion 251。

9. 聚合函數 avg() 等

xquery avg(db2-fn:XMLcolumn('AROMA.SALES.COMMENTS')/Comments/comment/store_rating/score)
-- 返回 4.113896...
-- 同類:sum、max、min、count

10. XQuery 嵌入 SQL db2-fn:sqlquery

xquery for $y in
  db2-fn:sqlquery(
    'SELECT Comments FROM aroma.sales a, aroma.store b
     WHERE city = ''New York'' AND a.storekey = b.storekey'
  )/Comments/comment/feedback/content/text()
return $y

SQL 字符串內單引號雙寫轉義(''New York'');db2-fn:sqlquery 執行 SQL 返回 XML 序列供 XQuery 後續處理。

總結

XQuery 與 SQL 非互斥,可組合發揮最大威力:SQL 關聯篩選行,XQuery 深度解析行內 XML。pureXML 讓 DB2 成為處理混合工作負載的理想平台。

創建 XML 數據庫向導 命令編輯器提示 XQuery 注意事項

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved