程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2 9打開打開通往 XML 之門

DB2 9打開打開通往 XML 之門

編輯:DB2教程
 DB2 9 提供了 Java 應用程序開發人員很容易上手的新的 XML 支持。這是因為 DB2 9 允許程序員使用熟悉的 JDBC 語句和業界標准的查詢語言來查詢、插入、更新和刪除 XML 數據以及傳統的 SQL 數據。

  在本文中,我將展示關於如何使用 Java 構建采用 DB2 “pureXML” 技術的應用程序的詳細例子,pureXML 技術允許以 XML 固有的分層格式存儲和查詢 XML。

  DB2 的 XML 支持

  DB2 9 為管理、存儲、查詢和索引 XML 數據提供了一些新的機制。特別地,DB2 引入了:

  •   一種 XML 數據類型,它允許 DB2 以一種經過解析的、分層的格式存儲 XML 文檔。
  •   新的索引技術,這種技術能提高跨 XML 文檔和在 XML 文檔內進行搜索的查詢的運行時性能。
  •   基於業界標准的查詢語言支持,包括 SQL 的新的 XML 擴展(通常被稱作 SQL/XML)和 XQuery,後者是專為 XML 設計的。
  •   對基於用戶提供模式驗證 XML 數據的支持,它可以幫助管理員為 DB2 中的 XML 數據施加完整性約束。
  •   一些管理功能,包括對關鍵數據庫實用程序的擴展。

  Java 程序員特別感興趣的一個新特性是 DB2 新的 Developer Workbench,它是建立在開放源代碼 Eclipse 3.1 平台之上的。(請參閱 Developer Workbench 文章。)這個集成開發環境(IDE)可以幫助程序員快速開發、測試和調試他們的數據庫應用程序。

  對於本文中的例子,我將一直使用 DB2 Developer Workbench。當然,Java 程序員可以使用任何受支持的 IDE 或 Java Development Kit (JDK) 來創建 DB2 XML 應用程序。

  設置環境

  本文中的代碼示例引用了一個 CLIENTS 表,該表用於跟蹤關於客戶的信息。清單 1 展示了這個表的定義。

  

  注意,CLIENTS 包含三個基於傳統 SQL 數據類型的列,另外還有一個基於新的名為 “XML” 的 SQL 數據類型的列。後面那個列(即 contactinfo)存儲 XML 文檔,這些 XML 文檔包括諸如客戶的郵件地址、電話號碼、電子郵件地址等之類的信息。圖 1 展示了一個這樣的 XML 文檔。

  圖 1. 存儲在 CLIENTS 表中的示例 XML 文件

  圖 1. 存儲在 CLIENTS 表中的示例 XML 文件

  我將展示如何將該文件和其他信息插入到這個 DB2 表中。不過,首先我們還是來討論一下如何配置 DB2 Developer Workbench。

  為了使用 DB2 Developer Workbench 編譯和運行 DB2 XML 應用程序,需要按照標准的 Eclipse 過程來創建一個新的 Java 項目,並將適當的 DB2 庫包括在項目的構建路徑中。如果您之前沒有使用過 Eclipse,那麼下面是對如何完成這些任務作了一個簡短的概述:

  1. 啟動 DB2 Developer Workbench。
  2. 創建一個新項目。切換到 Java 透視圖( Window → Open Perspective → Java),並選擇 File → New → Project。根據向導的提示指定一個項目名。對於其他項,則保留默認設置。
  3. 將 DB2 庫添加到項目的構建路徑中。選中您的項目,單擊右鍵,然後選擇 Properties。選擇 Java Build Path,並單擊 LibrarIEs 標簽頁。添加適當的 DB2 外部 .jar 文件,例如 db2jcc.jar、db2jcc_javax.jar 和 db2jcc_license_cu.jar。這些文件位於 DB2 安裝目錄的 \Java 子目錄中。
  4. 還可以選擇為應用程序創建一個包。選中您的項目,單擊右鍵,然後選擇 New → Package。

  要查看詳細信息,可以從 workbench 的主菜單中單擊 Help。

 連接到數據庫

 

  要使用 DB2 XML 數據,需要建立到目標數據庫的連接,對於其他 DB2 應用程序也是如此。清單 2 是一個用於建立 DB2 數據庫連接的助手方法的代碼片段。

  

  插入 XML 數據

  DB2 程序員使用熟悉的 SQL INSERT 語句來將新的 XML 數據寫到包含 XML 列的表中。DB2 可以存儲最大為 2 GB 的任何格式良好的 XML 文檔。

  通常,Java 程序員需要將包含在文件中的 XML 數據插入到 DB2 表中,但是,他們也可以插入來自字符串、二進制數據(包括大型對象)和 SQL 子選擇語句中的 XML 數據。

  清單 3 展示了將一行插入到 CLIENTS 表中的方法。在這個例子中,contactinfo 列的 XML 文檔是從一個文件中讀取的。

  

  我們來逐步考察這段代碼。insertFile() 方法定義了一些變量,這些變量將在 INSERT 語句中用到。前三個變量對應於 CLIENTS 表中的 ID、name 和 status 這三列。第四個變量是要插入到 contactinfo 列的 XML 文件的文件名。(為簡單起見,在這個例子中這些值是硬編碼的。)

  建立了數據庫連接之後,該方法創建一個 sqlstmt 字符串,其中包含用於輸入列值的四個參數占位符。然後像通常一樣准備 INSERT 語句,並設置它的四個參數占位符。為了設置用於 XML 列的占位符,該方法打開一個 FileInputStream。它還計算被引用的 XML 文件的長度,並使用該信息作為 setBinaryStream() 方法的輸入。最後,該方法執行 INSERT 語句,將 XML 和傳統 SQL 數據插入到這個表中的一行中。

  DB2 還允許用戶注冊 XML 模式,並且還允許用戶在插入之前用這些模式來驗證輸入文檔,不過這個特性在上述代碼中沒有體現出來。XML 模式是萬維網聯盟(W3C)業界標准的一部分;XML 模式使用戶可以指定符合規范的 XML 文檔應有的結構,例如可接受的 XML 元素的順序和數據類型,特定 XML 名稱空間的使用,等等。

  查詢 XML 數據

 

  現在您已經將 XML 數據插入到了 DB2 中,接下來可以查詢 XML 數據了。DB2 允許編寫各種類型的查詢。您可以編寫用於檢索整個 XML 文檔的簡單查詢,也可以編寫根據 XML 謂詞和關系查詢謂詞檢索 XML 文檔中的某些部分的高級查詢。DB2 還支持其他類型的一些查詢,例如將 XML 數據轉換到新的 XML 文檔,連接 XML 和非 XML 數據,聚合各種類型的數據,等等。在本文中,我將演示這樣一個查詢:

  1. 基於關系謂詞和 XML 謂詞過濾數據
  2. 檢索符合條件的 XML 文檔的某些部分以及存儲在傳統 SQL 列中的數據。

  DB2 目前支持兩種查詢語言:SQL 和 XQuery。一個應用程序可以包含用其中一種或兩種語言編寫的不同查詢。XQuery 不支持參數占位符。實際上,這意味不需要硬編碼查詢謂詞的 Java 應用程序中的 XQuery 查詢,必須被包裝在一個使用 SQL/XML 函數(例如 XMLQuery()、XMLExists() 或 XMLTable())的 SQL 語句中。本文中的示例應用程序使用 XMLQuery() 和 XMLExists() 來闡釋一個常見的編程任務:檢索 XML 文檔的某些部分。

  清單 4 中展示的例子返回居住在郵政編碼為 95125 的地區的 “黃金(Gold)” 客戶的姓名和首選電子郵件地址。客戶姓名和狀態信息(例如 “Gold” 或 “Silver”)存儲在 SQL VARCHAR 列,而電子郵件地址和郵政編碼則包含在存儲在 contactinfo 列中的 XML 文檔中。因此,這個例子同時涉及到傳統 SQL 數據和 XML 數據。

  

  對於查詢變量中定義的查詢語句有必要更仔細地作一番考察,特別是那些不熟悉 SQL/XML 和 XQuery 的讀者更要加以注意。雖然對這些語言作徹底的討論已超出了本文的范圍,不過我們將詳細分析這個查詢中的每一行,使您理解它的邏輯。

  第一行指定 SQL name 列和 XMLQuery() 函數的輸入將被包括在結果集中。為了指示 DB2 檢索第一個符合條件客戶的 email 元素,代碼中包括了一個 XPath 表達式。XPath 是 XQuery 的一部分,它提供了一種在 XML 文檔層次之間進行導航的方式。這個 XPath 表達式指示 DB2 導航到每個符合條件的 XML 文檔的 Client 根元素下的第一個 email 元素。(注意,路徑表達式是大小寫敏感的)。$c 變量和 SQL FROM 子句表明這些文檔可以在哪裡找到(在 CLIENTS 表的 contactinfo 列中)。

  SQL WHERE 子句用於限制返回的數據。特別地,它規定返回的 XML 文檔只包括客戶狀態為某個特定值(Gold)的行中的 XML 文檔。而且,只有居住在某個特定地區(郵政編碼為 95125)的客戶的記錄才符合條件。XMLExists() 函數指定後一個限制。

  在這個示例查詢中,XMLExists() 指示 DB2 確定一個給定的 XML 文檔中是否包括指定郵政編碼的客戶地址。PASSING 子句指定可以在哪裡找到 XML 文檔(在 contactinfo 列中)。注意,這個 PASSING 子句中的 $x 周圍出現了轉義符(反斜槓)。這個查詢的最後一行調用 CAST() 函數來將輸入參數(用於郵政編碼)的值強制轉換為適當的 SQL 數據類型。在這個例子中,由 5 個字符組成的字符串是可以接受的。清單 5 展示了這個程序的輸出。

  

  在這個示例輸出中,有一個符合條件的客戶(Edward Chen)沒有返回電子郵件信息。這表明他的 XML contactinfo 文檔中沒有包含 email 元素,可能是因為他在客戶簡歷表中沒有提供電子郵件地址。還應注意,雖然 Paula Lipenski 的聯系方式信息中有兩個電子郵件地址(見圖 1),但是輸出中只返回了她的一個電子郵件地址。這是因為示例應用程序顯式地指示 DB2 只檢索符合條件的客戶的第一個電子郵件地址。(見 XMLQuery() 函數中的 XPath 表達式。)如果要去掉輸入中的 <:email> 標記,那麼可以使用 XMLQuery() 函數中的一個路徑表達式來指示 DB2 只返回 email 元素的文本值 $c/ClIEnt/email[1]/text()。

  編程提示

  雖然 DB2 的本地 XML 支持是新的,但是良好的數據庫應用程序編程實踐仍然適用。例如,指示 DB2 只檢索需要的數據這一點仍然很重要。如果只需要檢索 XML 文檔中包含的部分信息,那麼檢索整個 XML 文檔就會降低性能,另外還會不必要地消耗一些系統資源。類似地,您應該仔細考慮事務的范圍和隔離級別,在整體並發性與完整性之間取得平衡。

  本文是一篇介紹性的文章,因此探索 DB2 9 的 XML 特性超出了本文的范圍,但是這樣做是值得的。正如您可能期望的那樣,DB2 允許程序員使用熟悉的 SQL 語句更新和刪除 XML 數據。此外,IBM 還在 IBM developerWorks 上發布了一個用於 XML 數據的 “update” 存儲過程。這個存儲過程允許用戶只提供更改的 XML 數據來進行更新,而不必提供修改的 XML 文檔的全部內容。

  DB2 Developer Workbench 中有一些用於幫助程序員圖形化地構造 SQL/XQuery 查詢和 XQuery 查詢的向導。它還提供了用於構建操縱傳統 SQL 數據或本地 XML 數據的存儲過程的向導。所有向導都可以在 workbench 的 Data 透視圖中啟動。

  要獲得關於所有這些專題的詳細信息,請參閱相應的在線文檔或本文後面列出的參考資料。

  新鮮,但是熟悉

  需要處理存儲在 DB2 中的本地 XML 數據的 Java 程序員可以使用熟悉的 JDBC 語句來執行查詢和處理結果。為幫助程序員編寫、測試和調試他們的 Java 應用程序,IBM 提供了一個基於 Eclipse 的 Developer Workbench for DB2。這個 workbench 提供了用於查看數據庫內容、用 SQL/XML 或 XQuery 編寫查詢以及生成存儲過程的向導。

  查詢 XML 數據

 

  現在您已經將 XML 數據插入到了 DB2 中,接下來可以查詢 XML 數據了。DB2 允許編寫各種類型的查詢。您可以編寫用於檢索整個 XML 文檔的簡單查詢,也可以編寫根據 XML 謂詞和關系查詢謂詞檢索 XML 文檔中的某些部分的高級查詢。DB2 還支持其他類型的一些查詢,例如將 XML 數據轉換到新的 XML 文檔,連接 XML 和非 XML 數據,聚合各種類型的數據,等等。在本文中,我將演示這樣一個查詢:

  1. 基於關系謂詞和 XML 謂詞過濾數據
  2. 檢索符合條件的 XML 文檔的某些部分以及存儲在傳統 SQL 列中的數據。

  DB2 目前支持兩種查詢語言:SQL 和 XQuery。一個應用程序可以包含用其中一種或兩種語言編寫的不同查詢。XQuery 不支持參數占位符。實際上,這意味不需要硬編碼查詢謂詞的 Java 應用程序中的 XQuery 查詢,必須被包裝在一個使用 SQL/XML 函數(例如 XMLQuery()、XMLExists() 或 XMLTable())的 SQL 語句中。本文中的示例應用程序使用 XMLQuery() 和 XMLExists() 來闡釋一個常見的編程任務:檢索 XML 文檔的某些部分。

  清單 4 中展示的例子返回居住在郵政編碼為 95125 的地區的 “黃金(Gold)” 客戶的姓名和首選電子郵件地址。客戶姓名和狀態信息(例如 “Gold” 或 “Silver”)存儲在 SQL VARCHAR 列,而電子郵件地址和郵政編碼則包含在存儲在 contactinfo 列中的 XML 文檔中。因此,這個例子同時涉及到傳統 SQL 數據和 XML 數據。

  

  對於查詢變量中定義的查詢語句有必要更仔細地作一番考察,特別是那些不熟悉 SQL/XML 和 XQuery 的讀者更要加以注意。雖然對這些語言作徹底的討論已超出了本文的范圍,不過我們將詳細分析這個查詢中的每一行,使您理解它的邏輯。

  第一行指定 SQL name 列和 XMLQuery() 函數的輸入將被包括在結果集中。為了指示 DB2 檢索第一個符合條件客戶的 email 元素,代碼中包括了一個 XPath 表達式。XPath 是 XQuery 的一部分,它提供了一種在 XML 文檔層次之間進行導航的方式。這個 XPath 表達式指示 DB2 導航到每個符合條件的 XML 文檔的 Client 根元素下的第一個 email 元素。(注意,路徑表達式是大小寫敏感的)。$c 變量和 SQL FROM 子句表明這些文檔可以在哪裡找到(在 CLIENTS 表的 contactinfo 列中)。

  SQL WHERE 子句用於限制返回的數據。特別地,它規定返回的 XML 文檔只包括客戶狀態為某個特定值(Gold)的行中的 XML 文檔。而且,只有居住在某個特定地區(郵政編碼為 95125)的客戶的記錄才符合條件。XMLExists() 函數指定後一個限制。

  在這個示例查詢中,XMLExists() 指示 DB2 確定一個給定的 XML 文檔中是否包括指定郵政編碼的客戶地址。PASSING 子句指定可以在哪裡找到 XML 文檔(在 contactinfo 列中)。注意,這個 PASSING 子句中的 $x 周圍出現了轉義符(反斜槓)。這個查詢的最後一行調用 CAST() 函數來將輸入參數(用於郵政編碼)的值強制轉換為適當的 SQL 數據類型。在這個例子中,由 5 個字符組成的字符串是可以接受的。清單 5 展示了這個程序的輸出。

  

  在這個示例輸出中,有一個符合條件的客戶(Edward Chen)沒有返回電子郵件信息。這表明他的 XML contactinfo 文檔中沒有包含 email 元素,可能是因為他在客戶簡歷表中沒有提供電子郵件地址。還應注意,雖然 Paula Lipenski 的聯系方式信息中有兩個電子郵件地址(見圖 1),但是輸出中只返回了她的一個電子郵件地址。這是因為示例應用程序顯式地指示 DB2 只檢索符合條件的客戶的第一個電子郵件地址。(見 XMLQuery() 函數中的 XPath 表達式。)如果要去掉輸入中的 <:email> 標記,那麼可以使用 XMLQuery() 函數中的一個路徑表達式來指示 DB2 只返回 email 元素的文本值 $c/ClIEnt/email[1]/text()。

  編程提示

  雖然 DB2 的本地 XML 支持是新的,但是良好的數據庫應用程序編程實踐仍然適用。例如,指示 DB2 只檢索需要的數據這一點仍然很重要。如果只需要檢索 XML 文檔中包含的部分信息,那麼檢索整個 XML 文檔就會降低性能,另外還會不必要地消耗一些系統資源。類似地,您應該仔細考慮事務的范圍和隔離級別,在整體並發性與完整性之間取得平衡。

  本文是一篇介紹性的文章,因此探索 DB2 9 的 XML 特性超出了本文的范圍,但是這樣做是值得的。正如您可能期望的那樣,DB2 允許程序員使用熟悉的 SQL 語句更新和刪除 XML 數據。此外,IBM 還在 IBM developerWorks 上發布了一個用於 XML 數據的 “update” 存儲過程。這個存儲過程允許用戶只提供更改的 XML 數據來進行更新,而不必提供修改的 XML 文檔的全部內容。

  DB2 Developer Workbench 中有一些用於幫助程序員圖形化地構造 SQL/XQuery 查詢和 XQuery 查詢的向導。它還提供了用於構建操縱傳統 SQL 數據或本地 XML 數據的存儲過程的向導。所有向導都可以在 workbench 的 Data 透視圖中啟動。

  要獲得關於所有這些專題的詳細信息,請參閱相應的在線文檔或本文後面列出的參考資料。

  新鮮,但是熟悉

  需要處理存儲在 DB2 中的本地 XML 數據的 Java 程序員可以使用熟悉的 JDBC 語句來執行查詢和處理結果。為幫助程序員編寫、測試和調試他們的 Java 應用程序,IBM 提供了一個基於 Eclipse 的 Developer Workbench for DB2。這個 workbench 提供了用於查看數據庫內容、用 SQL/XML 或 XQuery 編寫查詢以及生成存儲過程的向導。

  查詢 XML 數據

 

  現在您已經將 XML 數據插入到了 DB2 中,接下來可以查詢 XML 數據了。DB2 允許編寫各種類型的查詢。您可以編寫用於檢索整個 XML 文檔的簡單查詢,也可以編寫根據 XML 謂詞和關系查詢謂詞檢索 XML 文檔中的某些部分的高級查詢。DB2 還支持其他類型的一些查詢,例如將 XML 數據轉換到新的 XML 文檔,連接 XML 和非 XML 數據,聚合各種類型的數據,等等。在本文中,我將演示這樣一個查詢:

  1. 基於關系謂詞和 XML 謂詞過濾數據
  2. 檢索符合條件的 XML 文檔的某些部分以及存儲在傳統 SQL 列中的數據。

  DB2 目前支持兩種查詢語言:SQL 和 XQuery。一個應用程序可以包含用其中一種或兩種語言編寫的不同查詢。XQuery 不支持參數占位符。實際上,這意味不需要硬編碼查詢謂詞的 Java 應用程序中的 XQuery 查詢,必須被包裝在一個使用 SQL/XML 函數(例如 XMLQuery()、XMLExists() 或 XMLTable())的 SQL 語句中。本文中的示例應用程序使用 XMLQuery() 和 XMLExists() 來闡釋一個常見的編程任務:檢索 XML 文檔的某些部分。

  清單 4 中展示的例子返回居住在郵政編碼為 95125 的地區的 “黃金(Gold)” 客戶的姓名和首選電子郵件地址。客戶姓名和狀態信息(例如 “Gold” 或 “Silver”)存儲在 SQL VARCHAR 列,而電子郵件地址和郵政編碼則包含在存儲在 contactinfo 列中的 XML 文檔中。因此,這個例子同時涉及到傳統 SQL 數據和 XML 數據。

  

  對於查詢變量中定義的查詢語句有必要更仔細地作一番考察,特別是那些不熟悉 SQL/XML 和 XQuery 的讀者更要加以注意。雖然對這些語言作徹底的討論已超出了本文的范圍,不過我們將詳細分析這個查詢中的每一行,使您理解它的邏輯。

  第一行指定 SQL name 列和 XMLQuery() 函數的輸入將被包括在結果集中。為了指示 DB2 檢索第一個符合條件客戶的 email 元素,代碼中包括了一個 XPath 表達式。XPath 是 XQuery 的一部分,它提供了一種在 XML 文檔層次之間進行導航的方式。這個 XPath 表達式指示 DB2 導航到每個符合條件的 XML 文檔的 Client 根元素下的第一個 email 元素。(注意,路徑表達式是大小寫敏感的)。$c 變量和 SQL FROM 子句表明這些文檔可以在哪裡找到(在 CLIENTS 表的 contactinfo 列中)。

  SQL WHERE 子句用於限制返回的數據。特別地,它規定返回的 XML 文檔只包括客戶狀態為某個特定值(Gold)的行中的 XML 文檔。而且,只有居住在某個特定地區(郵政編碼為 95125)的客戶的記錄才符合條件。XMLExists() 函數指定後一個限制。

  在這個示例查詢中,XMLExists() 指示 DB2 確定一個給定的 XML 文檔中是否包括指定郵政編碼的客戶地址。PASSING 子句指定可以在哪裡找到 XML 文檔(在 contactinfo 列中)。注意,這個 PASSING 子句中的 $x 周圍出現了轉義符(反斜槓)。這個查詢的最後一行調用 CAST() 函數來將輸入參數(用於郵政編碼)的值強制轉換為適當的 SQL 數據類型。在這個例子中,由 5 個字符組成的字符串是可以接受的。清單 5 展示了這個程序的輸出。

  

  在這個示例輸出中,有一個符合條件的客戶(Edward Chen)沒有返回電子郵件信息。這表明他的 XML contactinfo 文檔中沒有包含 email 元素,可能是因為他在客戶簡歷表中沒有提供電子郵件地址。還應注意,雖然 Paula Lipenski 的聯系方式信息中有兩個電子郵件地址(見圖 1),但是輸出中只返回了她的一個電子郵件地址。這是因為示例應用程序顯式地指示 DB2 只檢索符合條件的客戶的第一個電子郵件地址。(見 XMLQuery() 函數中的 XPath 表達式。)如果要去掉輸入中的 <:email> 標記,那麼可以使用 XMLQuery() 函數中的一個路徑表達式來指示 DB2 只返回 email 元素的文本值 $c/ClIEnt/email[1]/text()。

  編程提示

  雖然 DB2 的本地 XML 支持是新的,但是良好的數據庫應用程序編程實踐仍然適用。例如,指示 DB2 只檢索需要的數據這一點仍然很重要。如果只需要檢索 XML 文檔中包含的部分信息,那麼檢索整個 XML 文檔就會降低性能,另外還會不必要地消耗一些系統資源。類似地,您應該仔細考慮事務的范圍和隔離級別,在整體並發性與完整性之間取得平衡。

  本文是一篇介紹性的文章,因此探索 DB2 9 的 XML 特性超出了本文的范圍,但是這樣做是值得的。正如您可能期望的那樣,DB2 允許程序員使用熟悉的 SQL 語句更新和刪除 XML 數據。此外,IBM 還在 IBM developerWorks 上發布了一個用於 XML 數據的 “update” 存儲過程。這個存儲過程允許用戶只提供更改的 XML 數據來進行更新,而不必提供修改的 XML 文檔的全部內容。

  DB2 Developer Workbench 中有一些用於幫助程序員圖形化地構造 SQL/XQuery 查詢和 XQuery 查詢的向導。它還提供了用於構建操縱傳統 SQL 數據或本地 XML 數據的存儲過程的向導。所有向導都可以在 workbench 的 Data 透視圖中啟動。

  要獲得關於所有這些專題的詳細信息,請參閱相應的在線文檔或本文後面列出的參考資料。

  新鮮,但是熟悉

  需要處理存儲在 DB2 中的本地 XML 數據的 Java 程序員可以使用熟悉的 JDBC 語句來執行查詢和處理結果。為幫助程序員編寫、測試和調試他們的 Java 應用程序,IBM 提供了一個基於 Eclipse 的 Developer Workbench for DB2。

  查詢 XML 數據

 

  現在您已經將 XML 數據插入到了 DB2 中,接下來可以查詢 XML 數據了。DB2 允許編寫各種類型的查詢。您可以編寫用於檢索整個 XML 文檔的簡單查詢,也可以編寫根據 XML 謂詞和關系查詢謂詞檢索 XML 文檔中的某些部分的高級查詢。DB2 還支持其他類型的一些查詢,例如將 XML 數據轉換到新的 XML 文檔,連接 XML 和非 XML 數據,聚合各種類型的數據,等等。在本文中,我將演示這樣一個查詢:

  1. 基於關系謂詞和 XML 謂詞過濾數據
  2. 檢索符合條件的 XML 文檔的某些部分以及存儲在傳統 SQL 列中的數據。

  DB2 目前支持兩種查詢語言:SQL 和 XQuery。一個應用程序可以包含用其中一種或兩種語言編寫的不同查詢。XQuery 不支持參數占位符。實際上,這意味不需要硬編碼查詢謂詞的 Java 應用程序中的 XQuery 查詢,必須被包裝在一個使用 SQL/XML 函數(例如 XMLQuery()、XMLExists() 或 XMLTable())的 SQL 語句中。本文中的示例應用程序使用 XMLQuery() 和 XMLExists() 來闡釋一個常見的編程任務:檢索 XML 文檔的某些部分。

  清單 4 中展示的例子返回居住在郵政編碼為 95125 的地區的 “黃金(Gold)” 客戶的姓名和首選電子郵件地址。客戶姓名和狀態信息(例如 “Gold” 或 “Silver”)存儲在 SQL VARCHAR 列,而電子郵件地址和郵政編碼則包含在存儲在 contactinfo 列中的 XML 文檔中。因此,這個例子同時涉及到傳統 SQL 數據和 XML 數據。

  

  對於查詢變量中定義的查詢語句有必要更仔細地作一番考察,特別是那些不熟悉 SQL/XML 和 XQuery 的讀者更要加以注意。雖然對這些語言作徹底的討論已超出了本文的范圍,不過我們將詳細分析這個查詢中的每一行,使您理解它的邏輯。

  第一行指定 SQL name 列和 XMLQuery() 函數的輸入將被包括在結果集中。為了指示 DB2 檢索第一個符合條件客戶的 email 元素,代碼中包括了一個 XPath 表達式。XPath 是 XQuery 的一部分,它提供了一種在 XML 文檔層次之間進行導航的方式。這個 XPath 表達式指示 DB2 導航到每個符合條件的 XML 文檔的 Client 根元素下的第一個 email 元素。(注意,路徑表達式是大小寫敏感的)。$c 變量和 SQL FROM 子句表明這些文檔可以在哪裡找到(在 CLIENTS 表的 contactinfo 列中)。

  SQL WHERE 子句用於限制返回的數據。特別地,它規定返回的 XML 文檔只包括客戶狀態為某個特定值(Gold)的行中的 XML 文檔。而且,只有居住在某個特定地區(郵政編碼為 95125)的客戶的記錄才符合條件。XMLExists() 函數指定後一個限制。

  在這個示例查詢中,XMLExists() 指示 DB2 確定一個給定的 XML 文檔中是否包括指定郵政編碼的客戶地址。PASSING 子句指定可以在哪裡找到 XML 文檔(在 contactinfo 列中)。注意,這個 PASSING 子句中的 $x 周圍出現了轉義符(反斜槓)。這個查詢的最後一行調用 CAST() 函數來將輸入參數(用於郵政編碼)的值強制轉換為適當的 SQL 數據類型。在這個例子中,由 5 個字符組成的字符串是可以接受的。清單 5 展示了這個程序的輸出。

  

  在這個示例輸出中,有一個符合條件的客戶(Edward Chen)沒有返回電子郵件信息。這表明他的 XML contactinfo 文檔中沒有包含 email 元素,可能是因為他在客戶簡歷表中沒有提供電子郵件地址。還應注意,雖然 Paula Lipenski 的聯系方式信息中有兩個電子郵件地址(見圖 1),但是輸出中只返回了她的一個電子郵件地址。這是因為示例應用程序顯式地指示 DB2 只檢索符合條件的客戶的第一個電子郵件地址。(見 XMLQuery() 函數中的 XPath 表達式。)如果要去掉輸入中的 <:email> 標記,那麼可以使用 XMLQuery() 函數中的一個路徑表達式來指示 DB2 只返回 email 元素的文本值 $c/ClIEnt/email[1]/text()。

  編程提示

  雖然 DB2 的本地 XML 支持是新的,但是良好的數據庫應用程序編程實踐仍然適用。例如,指示 DB2 只檢索需要的數據這一點仍然很重要。如果只需要檢索 XML 文檔中包含的部分信息,那麼檢索整個 XML 文檔就會降低性能,另外還會不必要地消耗一些系統資源。類似地,您應該仔細考慮事務的范圍和隔離級別,在整體並發性與完整性之間取得平衡。

  本文是一篇介紹性的文章,因此探索 DB2 9 的 XML 特性超出了本文的范圍,但是這樣做是值得的。正如您可能期望的那樣,DB2 允許程序員使用熟悉的 SQL 語句更新和刪除 XML 數據。此外,IBM 還在 IBM developerWorks 上發布了一個用於 XML 數據的 “update” 存儲過程。這個存儲過程允許用戶只提供更改的 XML 數據來進行更新,而不必提供修改的 XML 文檔的全部內容。

  DB2 Developer Workbench 中有一些用於幫助程序員圖形化地構造 SQL/XQuery 查詢和 XQuery 查詢的向導。它還提供了用於構建操縱傳統 SQL 數據或本地 XML 數據的存儲過程的向導。所有向導都可以在 workbench 的 Data 透視圖中啟動。

  要獲得關於所有這些專題的詳細信息,請參閱相應的在線文檔或本文後面列出的參考資料。

  新鮮,但是熟悉

  需要處理存儲在 DB2 中的本地 XML 數據的 Java 程序員可以使用熟悉的 JDBC 語句來執行查詢和處理結果。為幫助程序員編寫、測試和調試他們的 Java 應用程序,IBM 提供了一個基於 Eclipse 的 Developer Workbench for DB2。這個 workbench 提供了用於查看數據庫內容、用 SQL/XML 或 XQuery 編寫查詢以及生成存儲過程的向導。

這個 workbench 提供了用於查看數據庫內容、用 SQL/XML 或 XQuery 編寫查詢以及生成存儲過程的向導。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved