為了幫助您快速掌握 DB2 自身的 XML 特性,請完成幾個普通的任務,比如:
- 創建用於管理 XML 數據的數據庫對象,包括一個測試數據庫、一些示例表和視圖。
- 使用 INSERT 和 IMPORT 語句將 XML 數據填充到數據庫中。
- 驗證您的 XML 數據。使用 DB2 開發和注冊您的 XML 模式,並在導入數據時使用 XMLVALIDATE 選項。
後續文章將包括其他主題,比如使用 SQL 查詢、更新和刪除 DB2 XML 數據,使用 XQuery 查詢 DB2 XML 數據,開發存取 DB2 XML 數據的 Java 應用程序和 Web 組件。
創建數據庫對象
讓我們先來創建一個單獨的 DB2 Unicode 數據庫。在 DB2 Viper 中,只有 Unicode 數據庫才能同時存儲 XML 文檔和 SQL 數據的更多傳統格式,比如整數、日期/時間、變長字符串,等等。隨後,您將在這個數據庫中創建對象來管理 XML 和其他類型的數據。
創建測試數據庫
為了創建一個新的 DB2 Unicode “測試” 數據庫,打開 DB2 命令窗口,發出語句來指定 Unicode 編碼集合和支持的區域,如 清單 1:
清單 1. 創建用於存儲 XML 數據的數據庫
create database test using codeset UTF-8 territory us
一旦創建了 Unicode 數據庫,您就不需要發出任何專門的命令或采取任何進一步措施來使 DB2 能夠以它自身分層的格式存儲 XML 數據,因為您的 DB2 系統已經准備好了。
創建示例表
為了存儲 XML 數據,請創建包含一個或多個 XML 列的表。這些表充當文檔集合的邏輯容器;在幕後,DB2 實際上使用了不同的存儲方案來存儲 XML 和非 XML 數據。然而,使用表作為管理各種受支持的數據格式的邏輯對象,簡化了管理和應用程序開發問題,特別是當需要在一個單獨的查詢中集成不同的數據格式時。
您可以對 DB2 表進行定義,使其只包含 XML 列、只包含傳統 SQL 類型的列或者同時包含兩者。本文對後一種情況進行了建模。清單 2 中的例子連接到 “測試” 數據庫,並創建了兩個表。第一個是 “items” 表,追蹤關於貨物的銷售情況和顧客對貨物的評價信息。第二個表追蹤的是關於 “客戶” 的信息,包括關於聯系信息的數據。注意 “comments” 和 “contactinfo” 是基於新的 DB2 XML 數據類型,而所有其他的列都是基於傳統 SQL 數據類型的。
清單 2. 創建用於 XML 數據的表
connect to test;
create table items (
id int primary key not null,
brandname varchar(30),
itemname varchar(30),
sku int,
srp decimal(7,2),
comments XML
);
create table clIEnts(
id int primary key not null,
name varchar(50),
status varchar(10),
contactinfo XML
);
如果您仔細地查看這些表定義例子,您將注意到 “comments” 和 “contactinfo” 列都沒有進行 XML 文檔內部結構的定義。這是 DB2 的一個重要特性。用戶不需要為了存儲數據而預定義一個 XML 數據結構(或者,更准確地說是一個 XML 模式)。事實上,DB2 可以在一個單獨的列中存儲任何格式良好的 XML 文檔,這意味著不同模式的 XML 文檔 —— 或沒有和任何注冊的模式關聯的文檔 —— 都可以存儲在相同的 DB2 列中。當我們討論如何在 DB2 中存儲數據時,本文將深入討論這個特性。
創建視圖
您可以隨意地在包含 XML 數據的表上創建視圖,就像您可以在只包含傳統 SQL 數據類型的表上創建視圖一樣。清單 3 中的例子創建具有 “Gold” 狀態的客戶的一個視圖:
清單 3. 創建一個包含 XML 數據的視圖
create view goldvIEw as
select id, name, contactinfo
from clIEnts where status='Gold';
關於索引的一點說明
最後,沒有必要在 XML 列上創建專門的索引來提高數據的查詢速度。因為這是一篇介紹性文章,而且示例數據很少,所以本文不會涵蓋到那個主題。然而,在生產環境中,定義一個適當的索引對實現最佳的性能來說很關鍵。查看本文結尾部分的 “參考資料”,以助於了解 DB2 的新索引技術。存儲 XML 數據
創建好表之後,現在您就可以用數據填充它們了。您可以通過直接發出 SQL INSERT 語句來完成這項工作,或者通過調用 DB2 IMPORT 工具在後台發出 INSERT 語句。
使用 INSERT 語句
使用 INSERT,您可以直接向 DB2 中填充原始的 XML 數據。如果您已經編寫了一個應用程序並在變量中存儲了 XML 數據,那麼這可能是最容易的方法。但是如果您只是剛開始使用 DB2 Viper,並且不想編寫應用程序,那麼您可以交互地發出 INSERT 語句(我發現使用 DB2 Command Editor 是很方便的,雖然您也可以使用命令行處理器,如果您更喜歡那麼做的話)。
要使用 DB2 Command Editor,請啟動 DB2 Control Center。從頂端的下拉菜單 “Tools” 中選擇 Command Editor,將出現一個單獨的窗口,如 圖 1 所示。
圖 1. DB2 Command Editor
在上面的窗格中輸入下列語句:
清單 4. 交互地插入 XML 數據
connect to test;
insert into clIEnts values (77, 'John Smith', 'Gold',
XMLparse(document '<addr>111 Main St., Dallas, TX, 00112</addr>'
preserve whitespace)
)
單擊左側的綠色箭頭來執行該命令。
注意,聯機提供 XML 數據(如 清單 4 所示)需要您調用 XMLPARSE 函數,以把文檔從字符值轉換成 XML 類型值。本例中的輸入文檔相當簡單 。如果文檔很大或者很復雜,把 XML 數據鍵入到像清單 4 所示的 INSERT 語句中是不切實際的。在大多數情況下,您使用主機變量或者參數標記編寫一個應用程序來插入數據。您將發現本文帶有一個簡要的 Java 代碼編寫例子。然而,由於這是一個介紹性的教程,所以我們不會詳細地討論應用程序開發主題。相反,我們將討論使用數據填充 DB2 XML 列的另一種選擇 —— 使用 IMPORT 工具。
使用 DB2 IMPORT
如果您准備在文件中包含 XML 數據,DB2 IMPORT 工具為您提供了一個使用數據填充 DB2 表的簡單方式。您不需要編寫應用程序,只需要創建一個定界的 ASCII 文件,其中包含您想要裝載到表中的數據。參數為存儲在文件中的 XML 數據指定了適當的文件名稱。
您可以使用選擇的文本編輯器創建一個定界的 ASCII 文件。(按照慣例,這些文件通常都是 .del 類型的)。文件中的每一行都代表了導入到表中的一行數據。如果行中包含 XML Data Specifier (XDS),IMPORT 將讀取包含在引用的 XML 文件中的數據,並把數據導入到 DB2 中。例如,圖 2 中的第一行包含了 Ella Kimpton 的信息,包括她的 ID、姓名和顧客狀態。她的聯系信息也包括在 ClIEnt3227.XML 文件中。
圖 2. 輸入到 DB2 IMPORT 的示例定界 ASCII 文件
ClIEnt3227.xml 文件的內容如 圖 3 所示。就像您看到的,文件包含了 Ella Kimpton 的地址、電話號碼、傳真號碼和電子郵件等 XML 元素。
圖 3. 示例客戶 XML 文件
如果您並不是對所有希望插入的行都有 XML 文件,那麼您可能對導入數據感到好奇。這是很容易做到的,忽略輸入文件的 XDS 信息即可。例如,圖 4 中的 items.del 文件忽略 Item 3641(“Dress to Impress” 套裝)的 XML 文件名。結果這一行的 XML 列不包含任何數據。
圖 4. 示例定界 ASCII 文件中的一行沒有 XML Data SpecifIEr
有了 XML 文件和定界的 ASCII 文件,您現在就可以使用 DB2 IMPORT 了。清單 4 中的下面這個語句將 C:/XMLFILES 目錄中的 clients.del文件中指定的內容導入到 “clIEnts” 表中。
清單 4. 將數據導入到 “clIEnts” 表中
import from clIEnts.del of del xml from C:/XMLFILES insert into user1.clIEnts;
如 圖 2 所示的 clIEnts.del 包含了六行數據,包括對六個 XML 文件的引用。成功地執行 IMPORT 命令後的結果輸出如 圖 5 所示。圖 5. DB2 IMPORT 的示例輸出
獨立軟件供應商,例如 Exegenix,提供了將 Word、PDF和其他文檔格式轉換成 XML 的工具,以便於導入到 DB2 中。(參見 參考資料,獲得關於 Exegenix 的更多信息。)
驗證 XML 數據
INSERT 和 IMPORT 示例只是討論向表中寫入格式良好的 XML 數據。它們並不對數據進行驗證 —— 也就是說,它們不驗證數據是否符合特定的 XML 模式,並因此堅持使用確定的結構。控制 DB2 那麼做是可能的,然而,還是讓我們研究另外一種方式來完成這項任務:
步驟 1:創建 XML 模式
為了驗證 XML 數據,您需要定義一個 XML 模式,來指定可接受的 XML 元素、它們的順序和數據類型,等等。 XML 模式是一個 W3C 行業標准並且是用 XML 編寫的。盡管解釋 XML 模式的特性超出了本文的范疇,但是 Web 上有各種教程可供參考(參見 “參考資料”)。
有許多方式可以開發 XML 模式,從使用您喜愛的文本編輯器到手動創建模式,再到使用工具圖形化地設計或生成模式。獨立軟件供應商,例如 MDXSYS Limited,提供了這樣的 XML 工具,IBM 也通過它的 Java™ 集成開發環境提供了 XML 模式生成支持。
例如,使用 IBM WebSphere® Studio,您可以將 ClIEnt3227.xml 文件(如 圖 3 所示)導入到 Web 項目中。使用鼠標右擊,並選擇 Generate -> XML Schema。這將為特定的輸入文件生成一個有效的 XML 模式,如 圖 6 所示。然後您就可以修改該文件(如果需要)並將其注冊到 DB2。
圖 6. 使用 WebSphere Studio 從一個 XML 文件生成 XML 模式
讓我們假定您需要使 XML 模式相當靈活,從而使您可以收集不同顧客不同類型的聯系信息。例如,某些顧客可能向您提供多個電話號碼或電子郵件地址,而其他顧客則沒有提供這麼多。
圖 7 所示的 XML 模式源自 WebSphere Studio 生成的模式,提供了這種靈活性。它包括關於給定元素所允許的最小和最大出現次數(“minOccurs” 和 “maxOccurs”)的附加規范。在本例中,不要求顧客向您提供任何您想要收集的聯系信息。然而,如果顧客選擇給您電子郵件信息,該模式將啟用一致性文檔來包含最多 5 個電子郵件地址(即 5 個 “email” 元素值)。
圖 7. 用於客戶聯系信息的示例 XML 模式
就像您已經注意到的那樣,XML 模式也包含類型信息。盡管 圖 7 所示的模式只指定所有的基本元素都被視為字符串,但是大部分生產 XML 模式也使用其他數據類型,比如整數、小數、日期,等等。如果您針對一個作為 INSERT 或 IMPORT 操作一部分的給定模式來驗證 XML 文檔,那麼 DB2 將自動向您的 XML 文檔添加類型注釋。
步驟 2: 注冊 XML 模式
創建了一個適當的 XML 模式之後,您就需要向 DB2 注冊該模式。IBM 提供多種方式來完成這項任務。您可以從 DB2 Control Center 運行圖形化的向導來指導您完成該過程,調用系統提供的存儲過程,或直接發出 DB2 命令。在此讓我們使用第二種方法,因為它能夠幫助您更容易地理解在您那一端 DB2 實質上進行的操作。
如果您的模式非常大,您可能需要在嘗試注冊它之前增加應用程序堆的大小。例如,發出下列語句:
清單 4. 增加應用程序堆大小
connect to test;
update db cfg using applheapsz 10000;
接下來,注冊您的 XML 模式。如果您的 XML 模式沒有引用其他 XML 模式,您可能需要用單個命令來注冊並完成該過程。否則您還將需要發出單個命令來注冊您最初的 XML 模式,添加其他需要的模式並完成注冊過程。當模式文件變的非常大時,通常把它的內容分成多個文件來提高可維護性、可讀性和重用性。這類似於把一個復雜的應用程序或組件分解為多個模塊。關於這個主題的細節,請參考 W3C “XML Schema primer”(參見 “參考資料”)。本文使用了一個簡單、獨立的 XML 模式。您可以使用下面這個命令將其向 DB2 注冊:
清單 5. 注冊 XML 模式
register xmlschema 'http://mysample.org' from 'C:/XMLFiles/ClIEntInfo.xsd' as
user1.mysample complete;
在本例中,ClIEntInfo.xsd 是 XML 模式文件的名稱,它位於 C:/XMLFiles 目錄中。該 XML 模式將被注冊到 SQL 模式 “user1” 和 XML 模式 “mysample” 下的 DB2 的內部存儲庫中。本例中的 http://mysample.org 參數只是一個占位符,它指定 XML 實例文檔所引用的統一資源標識符 (URI);許多 XML 文檔使用名稱空間,這是用 URI 指定的。最後,“complete” 子句將指示 DB2 完成 XML 注冊過程,以便模式可以用於驗證 XML 數據。
值得注意的是,模式注冊過程沒有指定模式將應用到表的哪個(些)列。換句話說,模式不等於 SQL 列約束。一個給定的模式可以驗證不同表中的各種 XML 列。然而,驗證不是自動的。DB2 允許任何格式良好的 XML 文檔存儲在 XML 列中。如果您想在存儲之前驗證一個已注冊的模式數據,那麼您需要指示 DB2 完成這項任務。
步驟 3:導入具有驗證的 XML 數據
當創建了一個 XML 模式,並將它完全注冊到 DB2 中之後,您現在就可以在將 XML 數據插入或導入表中的時候,讓 DB2 對這些數據進行驗證。現在我們頭腦中有了模式驗證,再來回顧一下先前的 IMPORT 場景。
如果您已經填充了 “clients” 表,您會發現可以非常方便地刪除它的內容,或者刪除和重新創建表。這只在當您計劃像以前一樣向表中添加相同的數據時才需要。回想一下被定義為在客戶 ID 列上具有一個主鍵的 “clIEnts”,嘗試導入重復的行將失敗。
為了在將 XML 數據導入到 “client” 表時能夠對其進行驗證,請使用 DB2 IMPORT 的 XMLVALIDATE 子句。清單 6 中的下面這個語句將指示 DB2 使用您先前注冊的 XML 模式 (user1.mysample) 作為默認的 XDS (XML Data Specifier),在將它們插入到 “client” 之前驗證 clIEnts.del 文件中指定的 XML 文件。
清單 6. 導入具有驗證的 XML 數據
import from clIEnts.del of del xml from C:/XMLFILES XMLvalidate using xds default
user1.mysample insert into user1.clIEnts;
如果 DB2 確定一個 XML 文檔不符合指定的模式,那麼與該文檔相關的整個行都將會被拒絕。圖 8 闡釋了從 IMPORT 操作的示例輸出,在該操作中的六行有一行因為它的 XML 文檔不符合指定的模式而被拒絕。
圖 8. 來自 DB2 IMPORT 的示例輸出,其中一行被拒絕
值得注意的是,XMLVALIDATE 也可以與 INSERT 語句一起使用,以指示 DB2 在插入之前驗證 XML 數據。該語法與 IMPORT 例子所示的相似,即在調用 XMLVALIDATE 子句時指定一個已注冊(和已完成)的 XML 模式。(參見 “一個簡單的 Java 例子”,獲取關於這方面的更多信息。)
結束語
DB2 Viper 提供了一個重要的新能力來支持 XML,包括一個新的 XML 數據類型和底層的引擎級組件,能夠以有效的方式自動存儲和處理 XML 數據。為了幫助您快速掌握這些特性,這篇文章描述了如何創建一個用於存儲 XML 文檔的測試數據庫和示例表。還回顧了如何用 XML 數據填充數據庫。最後總結了 DB2 針對用戶提供的模式來驗證數據的能力,並提供了示例來向您展示如何入門。
現在您已經學習了如何使用 DB2 的新的 “原生” XML 能力存儲 XML 數據。至於如何查詢那些數據,您將在後續文章中看到,後續文章將向您介紹 DB2 的新的 XQuery 支持,以及它對 SQL 的擴展(有時候叫做 “SQL/XML”)。